在行上进行SQL去重(Distinct),但忽略一个列。

5
例如,具有三列和数据的表格。
col1  col2  col3
 10    20    30
 40    50    60
 40    50    80

希望只返回最后两行,因为col1和col2相同。

使用select distinct不能满足要求,因为col3是不同的。

因此输出应为:

 10 20 30
 40 50 xx (don't care)

1
应该返回哪一个?哪种关系型数据库管理系统? - Martin Smith
2个回答

7

由于您只有一个额外的列,因此您可以使用任意MIN/MAX聚合函数并使用GROUP BY语句。

SELECT col1,
       col2,
       MAX(col3) AS col3
FROM   YourTable
GROUP  BY col1,
          col2  

更普遍地说,如果你的关系型数据库管理系统支持分析函数,你可以使用。
WITH T
     AS (SELECT col1,
                col2,
                col3,
                ROW_NUMBER() OVER (PARTITION BY col1, col2 
                                       ORDER BY col1, col2) AS RN
         FROM   YourTable)
SELECT col1,
       col2,
       col3
FROM   T
WHERE  RN = 1  

是的,这似乎工作得很好。另外,FYI可以说(至少在SQLite中)。 - ort11
选择 *,MAX(col3) 作为 col3 从表中按 col1、col2 分组。 - ort11
*,MAX(col3)可能适用于您,但您可能会得到额外的列和联合等,这些可能不喜欢它。 - ort11

1

我在SQL Server中完成了这个:

-- Setup test data:
declare @table table (
    col1 int,
    col2 int,
    col3 int
)
insert into @table values (10, 20, 30)
insert into @table values (40, 50, 60)
insert into @table values (40, 50, 80)

-- Here's the query:
select col1, col2, cast(min(col3) as varchar(10)) as col3
from @table
group by col1, col2
having count(*) = 1
union all
select col1, col2, 'xx' as col3
from @table
group by col1, col2
having count(*) > 1

我想这假定你没有重复的行(所有字段都是重复的),否则你可能会得到一个不正确的“xx”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接