SQL查询X个不同的列值,所有行

时间:2018-08-08 14:16:18

标签: sql

是否有可能编写一个SQL查询,该查询将给我X列的不同值,该列使我拥有该列值的每一行?

例如,说我有以下DocID的行

1,
2,
3,
4,
5,
3

我要返回前4个不同的DocID

因此我应该回来

1,
2,
3,
4,
3

我想要前4个不同的DocID,我在其中获得每个行,其中包含每个DocID。

这样的查询可能吗?

编辑:这是针对使用MySQL的客户端的。另外,使用“ order by”子句还会导致数据库日志太大的错误。

谢谢

2 个答案:

答案 0 :(得分:0)

使用通用表表达式和Windows函数,您可以使用DENSE_RANK。请注意,在所有示例中,您必须选择如何排序不同的值以选择顶部的X。在上面的情况下,它看起来像是按整数排序的。

虽然此代码是sql server表变量,但该概念适用于大多数支持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    

答案 1 :(得分:0)

通常可以通过以下方法解决此问题:

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