是否有可能编写一个SQL查询,该查询将给我X列的不同值,该列使我拥有该列值的每一行?
例如,说我有以下DocID的行
1,
2,
3,
4,
5,
3
我要返回前4个不同的DocID
因此我应该回来
1,
2,
3,
4,
3
我想要前4个不同的DocID,我在其中获得每个行,其中包含每个DocID。
这样的查询可能吗?
编辑:这是针对使用MySQL的客户端的。另外,使用“ order by”子句还会导致数据库日志太大的错误。
谢谢
答案 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
);
注意:
group by
而不是count distinct
,因此排序可以基于其他内容(例如行数或行的计时)。fetch first 4 rows only
是标准SQL。某些数据库改为使用limit
或top
。