![](/img/trans.png)
[英]SQL Server - ROW_NUMBER() with PARTITION, how to get multiple records?
[英]SQL Server unique records in row_number() range of records
SELECT
*
FROM (
SELECT
row_number() OVER (ORDER BY ID) AS [rownum],
UserID, wfoKey
FROM
tbl_user_statistics2 Where (wfoKey = '4b1fbf7aa7')
) T
WHERE
rownum BETWEEN (@opt_start) AND (@opt_end)
上面的查詢有效,並將所有用戶ID從第1行(opt_start)拉到10,000(opt_end)。 在該數據集中,那些UserID是重復的。 我現在想為該行范圍(1到10,000)中的記錄提取唯一的UserID。 用戶可以選擇任意范圍,因此可以選擇10,0000到20,0000,因此查詢應獲取該范圍內的唯一UserID,依此類推。 我不需要結果中的rownum。
樣本數據:
1 dced6f0d-3a67-456d78cb7-fb73c8db0c13 4b1fbf7aa7
2 dced6f0d-3a67-456d78cb7-fb73c8db0c13 4b1fbf7aa7
3 6360f485-4f4d-4c9a98b0e-74fea312a25d 4b1fbf7aa7
4 6360f485-4f4d-4c9a98b0e-74fea312a25d 4b1fbf7aa7
結果將是:
dced6f0d-3a67-456d78cb7-fb73c8db0c13 4b1fbf7aa7
6360f485-4f4d-4c9a98b0e-74fea312a25d 4b1fbf7aa7
不知道如何繼續,或者可能有比row_number()更好的方法。 任何建議將不勝感激。
可以通過采用現有查詢並將其轉換為嵌入式視圖( T2
),然后從中查詢不同的記錄來解決此問題:
SELECT DISTINCT UserID, wfoKey FROM
(SELECT
*
FROM (
SELECT
row_number() OVER (ORDER BY ID) AS [rownum],
UserID, wfoKey
FROM
tbl_user_statistics2 Where (wfoKey = '4b1fbf7aa7')
) T
WHERE
rownum BETWEEN (@opt_start) AND (@opt_end)) T2
;With CTE1
AS
(
SELECT * , rn = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY wfoKey)
FROM tbl_user_statistics2
Where wfoKey = '4b1fbf7aa7'
),
CTE2
AS
(
SELECT ID, UserID, wfoKey
, RowNum = ROW_NUMBER() OVER (ORDER BY wfoKey)
FROM CTE1
WHERE rn = 1
)
SELECT ID, UserID, wfoKey
FROM CTE2
WHERE RowNum BETWEEN (@opt_start) AND (@opt_end)
您可以通過userID添加一個名為partition的片段
;with cte as(
SELECT
*
FROM (
SELECT
row_number() OVER (partition by USerID ORDER BY ID) AS [rownum],
UserID, wfoKey
FROM
tbl_user_statistics2 Where (wfoKey = '4b1fbf7aa7')
) T
WHERE
rownum BETWEEN (@opt_start) AND (@opt_end)
)
Select * from cte
where rownum =1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.