如何通过SQL选择唯一记录
当我从表中执行SELECT*时,我得到如下结果:如何通过SQL选择唯一记录,sql,database,Sql,Database,当我从表中执行SELECT*时,我得到如下结果: 1 item1 data1 2 item1 data2 3 item2 data3 4 item3 data4 如您所见,有来自第2列的dup记录item1被复制。那么,我怎样才能得到这样的结果: 1 item1 data1 2 item2 data3 3 item3 data4 只有一条记录与其他唯一记录一起从副本中返回。使用带有单个和多个列名的distinct关键字,可以获得不同的记录: 选择不同的列1、列2。。。 从表_名称; 如果只需
1 item1 data1
2 item1 data2
3 item2 data3
4 item3 data4
如您所见,有来自第2列的dup记录item1被复制。那么,我怎样才能得到这样的结果:
1 item1 data1
2 item2 data3
3 item3 data4
只有一条记录与其他唯一记录一起从副本中返回。使用带有单个和多个列名的distinct关键字,可以获得不同的记录:
选择不同的列1、列2。。。
从表_名称;
如果只需要删除重复项,请使用DISTINCT。应使用GROUP BY将聚合运算符应用于每个组
这取决于要为每个唯一项返回的行。您的数据似乎指示了最小数据值,因此在本例中,SQL Server是这样
SELECT item, min(data)
FROM table
GROUP BY item
我发现,如果出于任何原因无法使用DISTINCT,则GROUP BY将起作用。要获得结果中的所有列,您需要放置以下内容:
SELECT distinct a, Table.* FROM Table
它将把a作为第一列,其余的将是所有列,其顺序与您的定义相同。也就是说,将重复a列。选择有效
从…起
选择EFF_ST,按EFF_ST XYZ超额分配的行数
-
从ABC.CODE\u DIM
其中XYZ=1
order by EFF_ST fetch first 5 row only只需使用内部联接,因为group by不会处理多个列,这些列表示未包含在聚合函数中
SELECT a.*
FROM yourtable a
INNER JOIN
(SELECT yourcolumn,
MIN(id) as id
FROM yourtable
GROUP BY yourcolumn
) AS b
ON a.yourcolumn= b.yourcolumn
AND a.id = b.id;
您可以使用4种方法: 不同的 分组 子查询 行号为的公共表表达式CTE 考虑以下带有测试数据的样本表:
/** Create test table */
CREATE TEMPORARY TABLE dupes(word text, num int, id int);
/** Add test data with duplicates */
INSERT INTO dupes(word, num, id)
VALUES ('aaa', 100, 1)
,('bbb', 200, 2)
,('ccc', 300, 3)
,('bbb', 400, 4)
,('bbb', 200, 5) -- duplicate
,('ccc', 300, 6) -- duplicate
,('ddd', 400, 7)
,('bbb', 400, 8) -- duplicate
,('aaa', 100, 9) -- duplicate
,('ccc', 300, 10); -- duplicate
选项1:选择DISTINCT
这是最简单、最直接、也是最有限的方式:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
/*
word|num|
----|---|
aaa |100|
bbb |200|
bbb |400|
ccc |300|
ddd |400|
*/
备选案文2:分组方式
分组允许您添加聚合数据,如minid、maxid、count*等:
选项3:子查询
使用子查询,您可以首先确定要忽略的重复行,然后使用WHERE NOT in子查询构造在外部查询中过滤掉它们:
/** Find the higher id values of duplicates, distinct only added for clarity */
SELECT distinct d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
/*
id|
--|
5|
6|
8|
9|
10|
*/
/** Use the previous query in a subquery to exclude the dupliates with higher id values */
SELECT *
FROM dupes
WHERE id NOT IN (
SELECT d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
)
ORDER BY word, num;
/*
word|num|id|
----|---|--|
aaa |100| 1|
bbb |200| 2|
bbb |400| 4|
ccc |300| 3|
ddd |400| 7|
*/
选项4:行号为的公共表表达式
在公共表表达式CTE中,选择行号,按组列进行分区并按所需顺序排序。然后仅选择行号为1的记录:
你确定吗?我在w3schools上尝试了这个方法,结果与SELECT*相同,只是a是第一个column@Freakishly是的,这正是我在回答中所说的:/这行不通,您不能在distinct之后选择*,这样您将在SQL中得到一个1064错误syntax@Mohsinkhan我忘了写下表名。不知怎的,当我写这篇文章时,它起了作用,但我现在刚刚测试过,它没有在表名之前,这与选择不同的…完全相同,这是一个不同问题的答案,可能应该用这个标记的答案和Dave Baker的解是SO问题的正确解。此解决方案的优点是,它允许选择只有一些指定的不同列的行,并且必须定义一个列MINid AS id以仅选择多个指定列中的一个。这可能是因为答案实际上是错误的吗?DISTINCT至少应用于DB2上的所有选定列,这仍然会在各个列中返回重复的值。如图所示,第1行和第2行是唯一的观察结果。如果您想保留第2行而不是第1行,该怎么办?
/** Find the higher id values of duplicates, distinct only added for clarity */
SELECT distinct d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
/*
id|
--|
5|
6|
8|
9|
10|
*/
/** Use the previous query in a subquery to exclude the dupliates with higher id values */
SELECT *
FROM dupes
WHERE id NOT IN (
SELECT d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
)
ORDER BY word, num;
/*
word|num|id|
----|---|--|
aaa |100| 1|
bbb |200| 2|
bbb |400| 4|
ccc |300| 3|
ddd |400| 7|
*/
WITH CTE AS (
SELECT *
,row_number() OVER(PARTITION BY word, num ORDER BY id) AS row_num
FROM dupes
)
SELECT word, num, id
FROM cte
WHERE row_num = 1
ORDER BY word, num;
/*
word|num|id|
----|---|--|
aaa |100| 1|
bbb |200| 2|
bbb |400| 4|
ccc |300| 3|
ddd |400| 7|
*/