SQL:如何在某些列上选择distinct
我有一张像这样的桌子:SQL:如何在某些列上选择distinct,sql,sql-server,qsqlquery,Sql,Sql Server,Qsqlquery,我有一张像这样的桌子: +---+------------+----------+ |ID | SomeNumber | SomeText | +---+------------+----------+ |1 | 100 | 'hey' | |2 | 100 | 'yo' | |3 | 100 | 'yo' | <- Second occurrence |4 | 200 | 'ey' | |5
+---+------------+----------+
|ID | SomeNumber | SomeText |
+---+------------+----------+
|1 | 100 | 'hey' |
|2 | 100 | 'yo' |
|3 | 100 | 'yo' | <- Second occurrence
|4 | 200 | 'ey' |
|5 | 200 | 'hello' |
|6 | 200 | 'hello' | <- Second occurrence
|7 | 300 | 'hey' | <- Single
+---+------------+----------+
我不知道在这里该怎么办
我需要一些大致的东西:
SELECT t.ID, DISTINCT(t.SomeNumber, t.SomeText) --this is not possible
FROM (
SELECT mt.ID, mt.SomeNumber, mt.SomeText
FROM MyTable mt
GROUP BY mt.SomeNumber, mt.SomeText --can't without mt.ID
HAVING COUNT(*) > 1
)
有什么建议吗?使用带有行数和计数行的cte可以满足您的需要: 创建并填充样本表(请在以后的问题中保存此步骤): 查询:
;WITH cte as
(
SELECT id,
someNumber,
someText,
ROW_NUMBER() OVER (PARTITION BY someNumber, someText ORDER BY ID) rn,
COUNT(id) OVER (PARTITION BY someNumber) rc
FROM MyTable
)
SELECT id, someNumber, someText
FROM cte
WHERE rn = 1
AND rc > 1
结果:
id someNumber someText
1 100 hey
2 100 yo
4 200 ey
5 200 hello
我删除了不兼容的数据库标记。请用您真正使用的数据库进行标记。为什么
100'hey'
会出现在您的结果集中,它是一个“单一的”?我需要所有的数字,除非它们只出现一个。如果文本在同一个数字上出现两次,那么只剩下一个。我真的需要研究一下分区
函数。它有效-我想:)谢谢你,@zohar peledHi zohar,我有一个类似的问题,我不能理解按
和行数()分区的作用。
我有80列,我想在最后72列上gt distinct,前8列不包含PK或ID(这是一个视图),我无法决定在这两个分区语句中选择哪些列,您能帮我吗?Row_number()只需根据order by子句为每一行创建一个数字(如果指定了partition by,则为partition by)。如果指定了partition by,那么partition by子句中的每一组不同的值都会得到它自己的编号。看一看这个谢谢,这就是我想出来的:你能看一下吗?我不知道这是不是行,我没有样本数据,也没有想要的结果。您可能应该发布您自己的问题,以及示例数据和期望的结果。
;WITH cte as
(
SELECT id,
someNumber,
someText,
ROW_NUMBER() OVER (PARTITION BY someNumber, someText ORDER BY ID) rn,
COUNT(id) OVER (PARTITION BY someNumber) rc
FROM MyTable
)
SELECT id, someNumber, someText
FROM cte
WHERE rn = 1
AND rc > 1
id someNumber someText
1 100 hey
2 100 yo
4 200 ey
5 200 hello