【问题标题】:SQL DISTINCT based on a single column, but keep all columns as outputSQL DISTINCT 基于单个列,但保留所有列作为输出
【发布时间】:2023-03-03 03:45:01
【问题描述】:
--mytable
col1 col2 col3
1    A    red
2    A    green
3    B    purple
4    C    blue

让我们调用上面的表格mytable。我想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 才能得到我想要的?

【问题讨论】:

  • @a_horse_with_no_name 我正在使用 Teradata,它使用 “Teradata Vantage 高级 SQL 引擎”。我希望能回答您的问题,如果需要,这里还有更多内容teradata.com/Products/Software/Database

标签: sql join distinct teradata


【解决方案1】:

你可以使用窗口函数,尤其是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”开始。您可以控制是否获取最旧、最早、最大、最小的 . . .

【讨论】:

  • @JasonHunter 。 . .我看到你确实在问题中提供了一个表名,所以我更新了答案。
  • 越来越近了......但现在我收到错误“对象'mytable'不存在”。也许我的 Teradata SQL 数据库不支持该语法?任何解决方法? teradata.com/Products/Software/Database
  • @JasonHunter 。 . .那是您在问题中使用的名称。您需要使用正确的表名。 Teradata 支持此语法——它是标准 SQL 语法。
  • @JasonHunter 。 . .您更改指定最早的列的order by,依此类推。
  • @JasonHunter 。 . .窗口子句中的order by。是的。
【解决方案2】:

您可以在 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 中的表达式即可。

【讨论】:

    【解决方案3】:

    NOT EXISTS:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2019-01-10
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      相关资源
      最近更新 更多