SQL DISTINCT 基于单列,但保留所有列作为输出

SQL DISTINCT based on a single column, but keep all columns as output

--mytable
col1 col2 col3
1    A    red
2    A    green
3    B    purple
4    C    blue

我们把上面的table称为mytable。我想 select 只有 col2:

不同的值
SELECT DISTINCT
 col2
FROM
 mytable

当我这样做时,输出看起来像这样,这是预期的:

col2
A
B
C

但是如何执行相同类型的查询,同时保留所有列?输出如下所示。本质上,我正在 mytable 查看 col2,当 col2 多次出现时,我 保留第一行。

col1 col2 col3
1    A    red
3    B    purple
4    C    blue

SQL 函数(例如 DISTINCT)是否有我可以设置的参数?对于这个 DISTINCT 函数,我可以想象它类似于 KeepAllColumns = TRUE 吗?还是我需要执行 JOINs 才能得到我想要的?

您可以使用 window 函数,特别是 row_number():

select t.*
from (select t.*, row_number() over (partition by col2 order by col2) as seqnum
      from mytable t
     ) t
where seqnum = 1;

row_number() 枚举行,从“1”开始。你可以控制是否获取 oldest, earliest, largest, smallest 。 . .

NOT EXISTS:

select m.* from mytable m
where not exists (
  select 1 from mytable
  where col2 = m.col2 and col1 < m.col1
)

此代码将 return 没有另一行具有相同 col2col1 中较小值的行。

您可以在 Teradata 中使用 QUALIFY 子句:

SELECT col1, col2, col3
FROM mytable
QUALIFY ROW_NUMBER() OVER(PARTITION BY col2 ORDER BY col2) = 1 -- Get 1st row per group

如果您想更改确定要获取哪 col2 行的顺序,只需更改 ORDER BY.

中的表达式