|
■No75326 (モー さん) に返信 > pID 件数 > 1 3 > 2 1 > 3 2 > > SELECT文の結果期待値として > @Max=3の場合に、"pID=1" > @Max=4の場合に、"pID=1,2" > @Max=5の場合に、"pID=1,2"を期待します。
ということなら、 「SELECT pID, COUNT(*) FROM 子 GROUP BY pID」 をさらに再集計して、件数の累積を見れば OK ということになりますね。
残念ながら、SUM(COUNT(*)…) のような表現はできないため、 再集計する場合は、上記の結果を SELECT しなおして
SELECT pID, SUM(F) OVER (ORDER BY pID) FROM ( SELECT pID, COUNT(*) AS F FROM 子 GROUP BY pID ) AS T
などのようにします。(もしくは、WITH を使う手法もあります) これにより、
pID 累積件数 1 3 2 4 3 6
という結果を得られますので、あとはこれを @MAX で判断すればよいわけです。
HAVING のように、条件分の中で SUM が使えれば話が早いのですが、 ウィンドウ関数は SELECT 句でしか使えないため、この結果を もう一度 SELECT しなおす必要があります。
という事で素案。 他の書き方もあるとは思うので。
-- 案1 SELECT pID FROM ( SELECT pID, SUM(F) OVER (ORDER BY pID) AS F FROM ( SELECT pID, COUNT(*) AS F FROM 子 GROUP BY pID ) AS T ) AS T2 WHERE F <= @Max
-- 案2 WITH T (pID, F) AS ( SELECT pID, SUM(F) OVER (ORDER BY pID) FROM ( SELECT pID, COUNT(*) AS F FROM 子 GROUP BY pID ) AS T ) SELECT pID FROM T WHERE F <= @Max
-- 案3 WITH T1 (pID, F1) AS ( SELECT pID, COUNT(*) AS F FROM 子 GROUP BY pID ), T2 (pID, F2) AS ( SELECT pID, SUM(F1) OVER (ORDER BY pID) FROM T1 ) SELECT pID FROM T2 WHERE F2 <= @Max
=== 別案 ===
-- 案4 SELECT pID FROM ( SELECT pID, CASE WHEN LEAD(pID, 1) OVER (PARTITION BY pID ORDER BY cID) IS NULL THEN COUNT(*) OVER (ORDER BY cID) ELSE NULL END AS F FROM 子 ) AS T WHERE F <= @Max
-- 案5 WITH T (pID, F) AS ( SELECT pID, CASE WHEN LEAD(pID, 1) OVER (PARTITION BY pID ORDER BY cID) IS NULL THEN COUNT(*) OVER (ORDER BY cID) END FROM 子 ) SELECT pID FROM T WHERE F <= @Max
|