Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过SQL选择唯一记录_Sql_Database - Fatal编程技术网

如何通过SQL选择唯一记录

如何通过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。。。 从表_名称; 如果只需

当我从表中执行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。。。 从表_名称;
如果只需要删除重复项,请使用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|
*/