[英]SQL Query for X Number of Distinct Column Values, All Rows
是否有可能編寫一個SQL查詢,該查詢將給我X列的不同值,該列使我擁有該列值的每一行?
例如,說我有以下DocID的行
1,
2,
3,
4,
5,
3
我想返回前4個不同的DocID
所以我應該回來
1,
2,
3,
4,
3
我想要前4個不同的DocID,在其中我得到包含每個DocID的每一行。
這樣的查詢可能嗎?
編輯:這是針對使用MySQL的客戶端的。 同樣,使用“ order by”子句會導致數據庫日志太大而導致錯誤。
謝謝
使用通用表表達式和Windows函數,您可以使用DENSE_RANK。 請注意,在所有示例中,您必須選擇如何排序不同的值以選擇頂部的X。在上面的情況下,它看起來像是按整數排序的。
同樣,雖然此代碼是sql server table變量,但是該概念適用於支持cte和窗口功能的大多數現代RDBMS系統
DECLARE @Table AS TABLE (I INT)
INSERT INTO @Table VALUES (1),(2),(3),(4),(5),(4)
;WITH cte AS (
SELECT
*
,DENSE_RANK() OVER (ORDER BY I) as Ranking
FROM
@Table
)
SELECT *
FROM
cte
WHERE
Ranking <= 4
或者您可以和一群人一起上更老的學校,以獲得獨特的價值觀並加入
;WITH cte AS (
SELECT TOP 4 I
FROM
@Table
GROUP BY
I
ORDER BY
I
)
SELECT
t.I
FROM
cte c
INNER JOIN @Table t
ON c.I = t.I
這是沒有窗口函數或公用表表達式的情況下的外觀:
SELECT
t.I
FROM
( SELECT TOP 4 I
FROM
@Table
GROUP BY
I
ORDER BY
I) c
INNER JOIN @Table t
ON c.I = t.I
這通常可以通過執行以下操作來解決:
select t.*
from t
where t.docid in (select t2.docid
from t t2
group by t2.docid
order by t2.docid
fetch first 4 rows only
);
筆記:
group by
而不是不重復count distinct
,因此排序可以基於其他內容(例如行數或行時間)。 fetch first 4 rows only
是標准SQL。 一些數據庫使用limit
或top
代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.