【问题标题】:How to select * from table and group by a single column如何从表中选择*并按单列分组
【发布时间】:2019-07-13 22:23:11
【问题描述】:

我想从多个表中选择 *,但在不写出所有列名的情况下消除重复项。组合表中大约有 30 列,我不想把每一列都写出来。

我知道我可以写出所有列名,但我想看看是否有办法使用 select * 来做到这一点

SELECT
        a.* 

FROM "T1"."T2"."T3" a

LEFT JOIN "T1"."T2"."T4" b on b.id = a.id
LEFT JOIN "T1"."T2"."T5" c on c.id = a.id
LEFT JOIN "T1"."T2"."T6" d on d.id = a.id

WHERE a.org = '123' AND kind = 'abc' 

有没有办法按 a.id 分组而不必写出每个列名?最终表中有 41 列,我试图只返回 id 上的不同行。

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    不完全是group by,而是row_number()

    SELECT a.*
    FROM (SELECT a.*,
                 ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY a.id) as seqnum
          FROM "T1"."T2"."T3" a LEFT JOIN
               "T1"."T2"."T4" b 
               ON b.id = a.id LEFT JOIN
               "T1"."T2"."T5" c
               ON c.id = a.id LEFT JOIN
               "T1"."T2"."T6" d 
               ON d.id = a.id
          WHERE a.org = '123' AND kind = 'abc' 
         ) a
    WHERE seqnum = 1;
    

    【讨论】:

    • 非常感谢,成功!我是 SQL 的新手,您介意向我解释一下这是如何工作的吗? ROW_NUMBER() 等本质上是为重复条目的每一行分配一个数字,然后 WHERE seqnum = 1 告诉它只提取重复条目的第一行?
    • @朱莉。 . .是的,你有这个权利。 ROW_NUMBER() 提供了一个枚举。 PARTITION BY 表示要重新开始那里每个值的排序。 ORDER BY 提供排序。在这种情况下,没有提供真正的排序。
    • 感谢您花时间帮助和解释 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2014-02-04
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多