एक स्तंभ पर DISTINCT और शीर्ष पंक्तियाँ लौटाएँ


9

आप सबसे बड़े तीन अद्वितीय ग्राहकों के लिए कैसे क्वेरी करते हैं Purchase_Cost?

मैं DISTINCTकेवल पर लागू करना चाहता हूं Customer_Name, लेकिन नीचे की क्वेरी सभी तीन कॉलमों पर अलग-अलग लागू होती है। मुझे वांछित आउटपुट प्राप्त करने के लिए क्वेरी को कैसे संशोधित करना चाहिए?

SELECT DISTINCT TOP 3 customer_name, order_no, Purchase_Cost  
FROM PurchaseTable 
ORDER BY Purchase_Cost

यहां छवि विवरण दर्ज करें

जवाबों:


9

निम्नलिखित क्वेरी में अपना dbname और स्कीमानाम बदलें।

;WITH CTE AS 
(
SELECT  
       [Order_No]
      ,[Customer_Name]
      ,[Purchase_Cost]
     , ROW_NUMBER() OVER(PARTITION BY [customer Name] ORDER BY [Purchase Cost] DESC) AS "RowNumber"
  FROM [dbname].[schemaName].[PurchaseTable]
  )

  SELECT TOP(3)
       [Order_No]
      ,[Customer_Name]
      ,[Purchase_Cost]
  FROM CTE WHERE RowNumber=1
  ORDER BY [Purchase_Cost] DESC

मुझे यकीन है कि ऐसा करने के अन्य तरीके भी हैं। मेरा सुझाव है कि आप पढ़ सकते हैं इस


1

प्रयास करें:

SELECT DISTINCT TOP 3  order_no, customer_name,  Purchase_Cost
FROM
(   SELECT order_no, customer_name, Purchase_Cost, ROW_NUMBER() OVER(PARTITION BY customer_name ORDER BY Purchase_Cost DESC) Orders
    FROM PurchaseTable
) A
WHERE A.Orders = 1
ORDER BY Purchase_Cost DESC

0

मुझे लगता है कि यह अधिक कुशल हो सकता है कि अन्य समाधान, बशर्ते आपके पास एक सूचकांक हो: (Customer_Name, Purchase_Cost DESC) INCLUDE (Order_No)

;
WITH PurchaseTable AS
(
    SELECT * 
      FROM (VALUES ((501),('Carson'),(3400)),
                   ((502),('Thomas'),(625)),
                   ((503),('Daisy'),(4856)),
                   ((504),('Mary'),(2397)),
                   ((505),('Carson'),(5000))
           ) AS T(Order_No,Customer_Name,Purchase_Cost)
),
DistinctCustomers AS
(
    SELECT DISTINCT
           Customer_Name
      FROM PurchaseTable
)
SELECT TOP(3) 
       MaxCustomerOrder.Order_No,
       dc.Customer_Name,
       MaxCustomerOrder.Purchase_Cost
  FROM DistinctCustomers dc
 CROSS APPLY (SELECT TOP(1) * 
                FROM PurchaseTable pt 
               WHERE pt.Customer_Name = dc.Customer_Name 
               ORDER BY pt.Purchase_Cost DESC
             )    AS MaxCustomerOrder
 ORDER BY MaxCustomerOrder.Purchase_Cost DESC
;

या इनलाइन टेबल परिभाषा के बिना:

;
WITH DistinctCustomers AS
(
    SELECT DISTINCT
           Customer_Name
      FROM PurchaseTable
)
SELECT TOP(3) 
       MaxCustomerOrder.Order_No,
       dc.Customer_Name,
       MaxCustomerOrder.Purchase_Cost
  FROM DistinctCustomers dc
 CROSS APPLY (SELECT TOP(1) * 
                FROM PurchaseTable pt 
               WHERE pt.Customer_Name = dc.Customer_Name 
               ORDER BY pt.Purchase_Cost DESC
             )    AS MaxCustomerOrder
 ORDER BY MaxCustomerOrder.Purchase_Cost DESC
;

पहली क्वेरी मान्य नहीं लगती है।
dezso

मैंने उसे ठीक करने की कोशिश की। निश्चित नहीं है कि अंतर 1 और 2 के बीच क्या है
ypercube

क्वेरी 2 में सिर्फ इनलाइन टेबल डेटा हटा दिया गया है। यदि आपको वास्तव में इसमें डेटा के साथ तालिका है, तो आपको इसकी आवश्यकता नहीं है। यदि आपके पास मेरी तरह वास्तविक तालिका नहीं है, तो आपको यह परीक्षण करने की आवश्यकता होगी कि यह चलता है।
जोनाथन रॉबर्ट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.