하나의 열에서 DISTINCT하고 TOP 행을 반환


9

가장 큰 고객 3 명을 어떻게 쿼리 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) 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 2016 년

나는 그것을 고치려고 노력했다. 쿼리 1과 2의 차이점이 확실하지 않습니다.
ypercubeᵀᴹ

쿼리 2는 인라인 테이블 데이터 만 제거했습니다. 실제로 데이터가 포함 된 테이블이있는 경우 필요하지 않습니다. 나와 같은 실제 테이블이 없으면 테이블이 실행되는지 테스트해야합니다.
Jonathan Roberts
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.