1

2 つの int フィールド (id、month) を持つテーブル t1 があり、いくつかの値を入力しました。出力として見たいのは、(月のidの数)の最大値です。次のコードを試してみましたが、正常に動作します。

select id,max(freq) as maxfreq from 
(select id,month,count(*) as freq
from t1
group by id,month) a
group by id
order by maxfreq desc

結果は次のとおりです。

ID  MAXFREQ
1   3
2   3
3   1
4   1

これで問題ありません。over partition by 句を使用してこれを達成するにはどうすればよいですか? そして、どちらがより効率的ですか?実際、私のテーブルは数千のレコードで構成されています。したがって、サブクエリを実行することは良い考えではないと思います! 助けてくれてありがとう。これがフィドルです

4

3 に答える 3

0
;WITH tmp AS (select id, row_number() over (partition by id, month order by id) rn
         FROM t1)
SELECT t.id, max(tmp.rn) as maxfreq
from t1 t
INNER JOIN tmp ON tmp.id = t.id
GROUP BY t.id
于 2014-09-12T07:31:18.810 に答える
0

同じ解決策ですが、CTEを使用しています。実際には、この問題に対してウィンドウ関数を強制的に使用する意味はありません。Plan Explorer で両方のソリューションを比較します。

; with c1 as ( select id,month,count(*) as freq from t1 group by id,month ) select id, max(freq) as maxfreq from c1 group by id order by maxfreq desc;

于 2014-09-12T09:50:48.290 に答える