DISTINCT en una columna y devuelve las filas SUPERIORES

9

¿Cómo consulta a tres clientes únicos con el mayor Purchase_Cost?

Quiero aplicar el DISTINCTúnico encendido Customer_Name, pero la consulta a continuación aplica el distinto en las tres columnas. ¿Cómo debo modificar la consulta para obtener el resultado deseado?

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

ingrese la descripción de la imagen aquí

Neal
fuente

Respuestas:

9

Reemplace su dbname y schemaName en la siguiente consulta.

;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

Estoy seguro de que hay otras formas de hacer lo mismo. Te sugiero que leas esto .

SqlWorldWide
fuente
1

por favor, inténtalo:

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
fuente
0

Creo que esto podría ser más eficiente que las otras soluciones, siempre que tenga un índice sobre: ​​(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
;

O sin la definición de tabla en línea:

;
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
fuente
La primera consulta no parece válida.
dezso
Traté de arreglarlo. No estoy seguro de cuál es la diferencia entre la consulta 1 y 2.
ypercubeᵀᴹ
La consulta 2 solo tiene los datos de la tabla en línea eliminados. No lo necesita si realmente tiene la tabla con los datos. Si no tiene la tabla real, como yo, la necesitaría para probar que se ejecuta.
Jonathan Roberts