Unterscheiden Sie sich in einer Spalte und geben Sie TOP-Zeilen zurück

9

Wie fragen Sie nach drei einzigartigen Kunden mit dem größten Purchase_Cost?

Ich möchte das DISTINCTeinzige auf anwenden Customer_Name, aber die folgende Abfrage wendet das Unterschiedliche auf alle drei Spalten an. Wie soll ich die Abfrage ändern, um die gewünschte Ausgabe zu erhalten?

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

Geben Sie hier die Bildbeschreibung ein

Neal
quelle

Antworten:

9

Ersetzen Sie Ihren Datenbanknamen und Ihren Schemanamen in der folgenden Abfrage.

;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

Ich bin sicher, es gibt andere Möglichkeiten, dasselbe zu tun. Ich schlage vor, Sie lesen dies .

SqlWorldWide
quelle
1

bitte versuche:

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
Fatih
quelle
0

Ich denke, dies könnte effizienter sein als die anderen Lösungen, vorausgesetzt, Sie haben einen Index für: (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
;

Oder ohne die Inline-Tabellendefinition:

;
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
;
Jonathan Roberts
quelle
Die erste Abfrage sieht nicht gültig aus.
Dekso
Ich habe versucht, es zu beheben. Ich
bin
In Abfrage 2 werden nur die Inline-Tabellendaten entfernt. Sie brauchen es nicht, wenn Sie tatsächlich die Tabelle mit den Daten darin haben. Wenn Sie nicht die tatsächliche Tabelle haben, wie ich, würden Sie sie benötigen, um zu testen, ob sie ausgeführt wird.
Jonathan Roberts