私はあなたがすべてのユーザーのために見つけたいと思うと思います、最小のテーブルの行、つまりid
ユーザーごとに1つの行。
その場合、サブクエリ(派生テーブル)を使用して、それをテーブルに結合します。
SELECT v.*
FROM views AS v
JOIN
( SELECT userid, MIN(id) AS entryid
FROM views
GROUP BY userid
) AS vm
ON vm.userid = v.userid
AND vm.entryid = v.id ;
上記は、必要に応じて、共通テーブル式(CTE)を使用して記述することもできます。
; WITH vm AS
( SELECT userid, MIN(id) AS entryid
FROM views
GROUP BY userid
)
SELECT v.*
FROM views AS v
JOIN vm
ON vm.userid = v.userid
AND vm.entryid = v.id ;
のインデックスを使用すると、どちらも非常に効率的(userid, id)
です。
ROW_NUMBER()
SQL-Serverでは、ウィンドウ関数を使用してこれを記述できます。
; WITH viewsRN AS
( SELECT *
, ROW_NUMBER() OVER (PARTITION BY userid ORDER BY id) AS rn
FROM views
)
SELECT * --- skipping the "rn" column
FROM viewsRN
WHERE rn = 1 ;