2011-10-24 34 views
1

興味深いSQL:は、私は私のテーブルにこのデータを持っているクエリ

onum amt   odate      cnum snum 

3001 18,69  1990-03-10 00:00:00.000  2008 1007 
3002 1900,10  1990-03-10 00:00:00.000  2007 1004 
3003 767,19  1990-03-10 00:00:00.000  2001 1001 
3005 5160,45  1990-03-10 00:00:00.000  2003 1002 
3006 1098,16  1990-03-10 00:00:00.000  2008 1007 
3007 75,75  1990-03-10 00:00:00.000  2004 1002 
3008 4723,00  1990-05-10 00:00:00.000  2006 1001 
3009 1713,23  1990-04-10 00:00:00.000  2002 1003 
3010 1309,95  1990-06-10 00:00:00.000  2004 1002 
3011 9891,88  1990-06-10 00:00:00.000  2006 1001 

は、私はこの結果を得る必要があります:私は毎日odateに最大amtを選択している

amt   odate      snum 

5160,45  1990-03-10 00:00:00.000  1002 
4723,00  1990-05-10 00:00:00.000  1001 
9891,88  1990-06-10 00:00:00.000  1001 

を、しかしで表示します売り手のsnum

もしこれを書いたら

SELECT MAX(amt), odate, snum 
FROM [Understanding].[dbo].[Orders] 
GROUP BY odate, snum 

日と売り手でグループを表示するため、出力が正しくありません。

答えて

4
;with C as 
(
    select amt, 
     odate, 
     snum, 
     row_number() over(partition by odate order by amt desc) as rn 
    from Orders 
) 
select amt, 
     odate, 
     snum 
from C 
where rn = 1  
+2

私は... SQL Serverが文の先頭にセミコロンを必要とするという事実のために使用されることはありません飽きないでしょう。) –

+1

@a_horse_with_no_name - まあ、それは実際には前の文の最後の文字です。 'merge'ステートメントでは、セミコロンで終わる必要があります。 'with'は前のステートメントがセミコロンで終了することを要求します。 SQL Serverでは、すべてのステートメントをセミコロンで終了する必要がある場合は、より一貫性があります。多分それは将来のバージョンで起こります。 –

+0

@a_horse_with_no_name: 'WITH'はSQL Serverのさまざまなコンテキストで使用できます。それがCTE(のリスト)を導入するとき、それはステートメントの始めになければならず、他の場合には、最初ではなく他のどこかにあるはずです。セミコロンは単に「WITH」の意味に関してあいまいさを取り除くだけです。 'WITH'の前に文がないとき(CTE定義の文脈では)、セミコロンを置く必要はありません。 –

0
select a.*,b.snum 
from 
(
select MAX(amt) as amt 
     ,odate 
from Orders 
group by odate 
)A INNER JOIN Orders B 
ON A.amt = b.amt 
order by a.odate 
関連する問題