「項目別の TOP 3 を求めるクエリー 」のセットベース版として、渋谷さんにいただいたアイデアです。
キーワードは、「相関サブクエリー」
改めて、クエリーエンジンの奥の深さを学んだ気がします。
■クエリー
SET NOCOUNT ON
-- 変数宣言
DECLARE @start datetime
-- 時間計測開始
SET @start = GETDATE()
SELECT T.Name, T.Value, T.ID
FROM T
WHERE T.Value <= (
SELECT MAX(T2.Value)
FROM (
SELECT TOP 3 T3.Name, T3.Value
FROM T T3
WHERE T3.Name = T.Name
ORDER BY T3.Value
) T2
GROUP BY T2.Name
HAVING T2.Name = T.Name
)
ORDER BY T.Name, T.Value
-- 時間表示
SELECT 'TIME(ms)' = DATEDIFF(ms, @start, GETDATE())