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 และ schemaName ของคุณในแบบสอบถามต่อไปนี้

;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) รวมถึง (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
อะไร

แบบสอบถาม 2 เพิ่งลบข้อมูลตารางแบบอินไลน์ คุณไม่จำเป็นต้องใช้ถ้าคุณมีตารางที่มีข้อมูลอยู่ในนั้น หากคุณไม่มีตารางจริงเช่นฉันคุณจะต้องทดสอบว่ามันทำงาน
Jonathan Roberts
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.