如何使用 SQL DISTINCT 从多个列中删除重复项?
How to use SQL DISTINCT to remove duplicates from multiple columns?
假设我有一个 table 有很多重复值。我想删除每列的重复项 单独 。使用 DISTINCT
删除列的重复组合,因此其他列仍然包含重复值。
原table是:
Col1 | Col2 | Col3
-----+------+------
a1 | b1 | c1
a1 | b2 | c1
a2 | b1 | NULL
a2 | b2 | c1
a3 | b1 | c1
a3 | NULL | NULL
我想要的结果是:
Col1 | Col2 | Col3
-----+------+------
a1 | b1 | c1
a2 | b2 | NULL
a3 | NULL | NULL
我可以分别通过几个查询得到这个结果:
SELECT DISTINCT Col1
FROM TABLE
SELECT DISTINCT Col2
FROM TABLE
SELECT DISTINCT Col3
FROM TABLE
但是我怎样才能在单个查询中做到这一点并且 return 产生一个结果集呢?
谢谢
您可以 UNION
将这三个查询放在一起:
SELECT DISTINCT Col1 FROM TABLE
UNION
SELECT DISTINCT Col2 FROM TABLE
UNION
SELECT DISTINCT Col3 FROM TABLE
这要求所有三个字段的类型相同(不能混合使用数字、字符串和日期)。
虽然这有点糟糕的设计味道。如果你发现自己经常联合这些,那么也许改变你的 table 看起来像 UNION 的结果。
我会使用 group by
...
;WITH c1 AS (
SELECT col1
, ROW_NUMBER() OVER (ORDER BY col1) AS [r]
FROM #foo
WHERE col1 IS NOT NULL
GROUP BY col1
)
, c2 AS (
SELECT col2
, ROW_NUMBER() OVER (ORDER BY col2) as [r]
FROM #foo
WHERE col2 IS NOT NULL
GROUP BY col2
)
, c3 AS (
SELECT col3
, ROW_NUMBER() OVER (ORDER BY col3) as [r]
FROM #foo
WHERE col3 IS NOT NULL
GROUP BY col3
)
select c1.col1
, c2.col2
, c3.col3
from c1 LEFT join c2
on c1.r = c2.r
left join c3
on c1.r = c3.r
ORDER BY c1.r ASC;
从问题描述中我不太确定你想要什么。我根据提供的理想输出制作了这个。
这是我使用的示例数据集。
CREATE TABLE #foo (
col1 char(2)
, col2 char(2)
, col3 char(2)
);
INSERT INTO #foo (col1, col2, col3)
VALUES ('a1', 'b2', null)
, ('a1', 'b1', 'c1')
, ('a2', Null, 'c1')
, ('a2', 'b1', null)
, ('a3', null, 'c1')
GO
这是查询的数据集和输出:
希望对您有所帮助!
假设我有一个 table 有很多重复值。我想删除每列的重复项 单独 。使用 DISTINCT
删除列的重复组合,因此其他列仍然包含重复值。
原table是:
Col1 | Col2 | Col3
-----+------+------
a1 | b1 | c1
a1 | b2 | c1
a2 | b1 | NULL
a2 | b2 | c1
a3 | b1 | c1
a3 | NULL | NULL
我想要的结果是:
Col1 | Col2 | Col3
-----+------+------
a1 | b1 | c1
a2 | b2 | NULL
a3 | NULL | NULL
我可以分别通过几个查询得到这个结果:
SELECT DISTINCT Col1
FROM TABLE
SELECT DISTINCT Col2
FROM TABLE
SELECT DISTINCT Col3
FROM TABLE
但是我怎样才能在单个查询中做到这一点并且 return 产生一个结果集呢?
谢谢
您可以 UNION
将这三个查询放在一起:
SELECT DISTINCT Col1 FROM TABLE
UNION
SELECT DISTINCT Col2 FROM TABLE
UNION
SELECT DISTINCT Col3 FROM TABLE
这要求所有三个字段的类型相同(不能混合使用数字、字符串和日期)。
虽然这有点糟糕的设计味道。如果你发现自己经常联合这些,那么也许改变你的 table 看起来像 UNION 的结果。
我会使用 group by
...
;WITH c1 AS (
SELECT col1
, ROW_NUMBER() OVER (ORDER BY col1) AS [r]
FROM #foo
WHERE col1 IS NOT NULL
GROUP BY col1
)
, c2 AS (
SELECT col2
, ROW_NUMBER() OVER (ORDER BY col2) as [r]
FROM #foo
WHERE col2 IS NOT NULL
GROUP BY col2
)
, c3 AS (
SELECT col3
, ROW_NUMBER() OVER (ORDER BY col3) as [r]
FROM #foo
WHERE col3 IS NOT NULL
GROUP BY col3
)
select c1.col1
, c2.col2
, c3.col3
from c1 LEFT join c2
on c1.r = c2.r
left join c3
on c1.r = c3.r
ORDER BY c1.r ASC;
从问题描述中我不太确定你想要什么。我根据提供的理想输出制作了这个。
这是我使用的示例数据集。
CREATE TABLE #foo (
col1 char(2)
, col2 char(2)
, col3 char(2)
);
INSERT INTO #foo (col1, col2, col3)
VALUES ('a1', 'b2', null)
, ('a1', 'b1', 'c1')
, ('a2', Null, 'c1')
, ('a2', 'b1', null)
, ('a3', null, 'c1')
GO
这是查询的数据集和输出:
希望对您有所帮助!