【问题标题】:SQL how to fill out first line of group with value and other values to nullSQL如何用值和其他值填写组的第一行为null
【发布时间】:2021-02-12 14:42:11
【问题描述】:

实际上我有一个包含 group by 的 select 语句

id      id_2  test
90001   7792  abc
90002   7792  abc
90003   7792  abc
94001   7024  efg
94002   7024  efg
94003   7024  efg

我想要这个:

id      id_2  test
90001   7792  abc
90002   7792  null
90003   7792  null
94001   7024  efg
94002   7024  null
94003   7024  null

如何使用 sql (pgsql) 做到这一点(测试值填写第一行组)?谢谢!

我尝试通过...进行分区

【问题讨论】:

    标签: sql postgresql group-by


    【解决方案1】:

    demo:db<>fiddle

    SELECT
        id,
        id_2,
        CASE WHEN row_number = 1 THEN test END as test         -- 2
    FROM (
        SELECT
            *,
            row_number() OVER (PARTITION BY id_2 ORDER BY id)  -- 1
        FROM mytable
    ) s
    
    1. 枚举有序组的所有记录以使用row_number() window function 查找第一个记录
    2. 如果行号为1,则保留该值,否则为NULL

    【讨论】:

      【解决方案2】:

      你可以使用:

      select id, id_2,
             (case when 1 = row_number() over (partition by id_2 order by id)
                   then test
              end) as test
      from t
      order by id_2 desc, id;
      

      注意:在外部查询中包含order by 很重要。否则,允许 SQL 引擎以任意顺序返回结果。

      另外,我建议您在表示层而不是在查询中执行此操作,但这完全取决于您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-13
        • 2023-02-11
        • 2021-10-03
        • 2017-05-19
        • 1970-01-01
        • 2019-08-02
        • 2015-11-09
        • 2023-02-04
        相关资源
        最近更新 更多