2013-10-21 2 views
0

세 개의 열 (상인, 제품, 가격)이있는 테이블이 있습니다. 각 상인과 제품을 최대 가격으로 그 상인에게주고 싶습니다. 다음을 선택하면 반복되는 거래자가 표시됩니다.그룹별로, 순서별, 별개로

select Trader, Product, Max(Price) as Price 
from dbo.Sell 
group by Trader, Product 
order by Max(Price) desc 

위의 쿼리에 대해 고유 한 상거래는 어떻게 할 수 있습니까? 아래 쿼리는 아무 것도 변경하지 않습니다.

select distinct Trader, Product, Max(Price) as Price 
from dbo.Sell 
group by Trader, Product 
order by Max(Price) desc 

실제로 다음 쿼리는 거의 필요하지만 실제로 Price 대신 Product를보고 싶습니다.

select Trader, Max(Price) as Price 
from dbo.Sell 
group by Trader 

답변

1

이 쿼리를 사용하면 상인에게 최대 가격의 제품이 두 개 이상있는 경우에만 여러 레코드를 얻을 수 있습니다.

;with cte as (
    select Trader, Max(Price) as Price 
    from dbo.Sell 
    group by Trader 
) 
select cte.Trader, s.Product, cte.Price 
from cte join dbo.Sell s 
     on cte.Trader = s.Trader and cte.Price = s.Price 
order by cte.Price desc 

두 번째 방법은 rank() 기능을 사용할 수 있지만 다시 기능은 동일한 가격 레코드에 대한 여러 레코드를 가져올 것이다() 순위 것입니다.

단일 레코드을 얻으려면 Rank() 대신 Row_Number()을 사용할 수 있습니다.

;with cte as (
    select Trader, Product, Price, 
     Rank() over (partition by Trader order by Price desc) rnk 
    from dbo.Sell 

) 
Select Trader, Product, Price 
From cte 
Where rnk = 1 
Order by Price desc 
+0

아니요, 값이 여러 행에 대해 동일 할 수 있으므로 좋지 않습니다. – user1464922

+0

'최대 가격이 두 개인 상인 당 하나 이상의 제품'이있는 경우 어느 것을 선택해야합니까? – Kaf

+0

여기서 MAX (Price), TOP 1 일 수 있습니다. – user1464922