簡體   English   中英

SQL查詢X個不同列值的數量,所有行

[英]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
                 );

筆記:

  • 您沒有指定如何選擇“前4名”。 這是基於數字順序的。
  • 這使用group by而不是不重復count distinct ,因此排序可以基於其他內容(例如行數或行時間)。
  • fetch first 4 rows only是標准SQL。 一些數據庫使用limittop代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM