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
吗?还是我需要执行 JOIN
s 才能得到我想要的?
您可以使用 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 没有另一行具有相同 col2
和 col1
中较小值的行。
您可以在 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
.
中的表达式
--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
吗?还是我需要执行 JOIN
s 才能得到我想要的?
您可以使用 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 没有另一行具有相同 col2
和 col1
中较小值的行。
您可以在 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
.