하나의 열에서 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.