我想(並不是完全清楚)你想爲每個用戶找到最少有id
的表的行,所以每個用戶一行。
在這種情況下,您的使用子查詢(派生表),並將其加入到表:
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 ;
以上也可以使用Common Table Expression (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)
上的索引都是非常有效的。
隨着SQL-Server,您可以使用ROW_NUMBER()
窗函數寫:
; 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 ;
你對userid列有索引嗎? –
或者UserId和Id上的複合索引?是該行的PK嗎? –
因爲你應該做一個子查詢,它不應該那麼慢。如果您可以更改數據結構,則可以始終爲用戶的第一條記錄添加一列,並在代碼中保留該列,或者如果這將會太慢,則保留其他表格。 –