【问题标题】:Split rows to columns by certain number按一定数量将行拆分为列
【发布时间】:2021-06-06 18:59:09
【问题描述】:

我在表格中有以下几行:

dates
------------
"2021-01-02"
"2021-01-03"
"2021-01-11"
"2021-01-14"
...

我知道这些行表示日期范围。 因此,第一行是范围开始,下一行是范围结束。下一行是重新开始的范围等等(行数 mod 2 = 0)。

有没有办法选择这样的表:

range_start  | range_end
-------------+-------------
"2021-01-02"   "2021-01-03"
"2021-01-11"   "2021-01-14"
...            ...

?

PostgreSQL 版本是 10.17

【问题讨论】:

    标签: sql postgresql gaps-and-islands


    【解决方案1】:

    row_number()使用条件聚合:

    select min(date), max(date)
    from (select t.*, row_number() over (order by date) as seqnum
          from t
         ) t
    group by ceiling(seqnum / 2.0)
    

    【讨论】:

    • 谢谢,我也希望某种窗口函数允许只选择分组集中的第一条记录(范围开始)和分组集中的第二条(最后一条)记录(范围结束)。
    • @Andrey。 . .我不确定你的评论是什么意思。这就是问题所要求的。不需要额外的窗口函数。
    【解决方案2】:

    这应该可行:

    WITH ordered_table AS (
      SELECT
        dates,
        ROW_NUMBER () OVER (ORDER BY dates) AS creation_order
      FROM your_table
    )
    SELECT
      t1.dates AS range_start,
      t2.dates AS range_end
    FROM
      ordered_table t1
    INNER JOIN ordered_table t2 ON t2.creation_order = t1.creation_order + 1
    WHERE (t1.creation_order % 2) = 1 -- counting from 1
    

    更多详情:

    【讨论】:

    • 谢谢,有趣的想法)
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多