按一定数量将行拆分为列

Posted

技术标签:

【中文标题】按一定数量将行拆分为列【英文标题】: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

【问题讨论】:

【参考方案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

更多详情:

PG中的WITH PG中的row_number

【讨论】:

谢谢,有趣的想法)

以上是关于按一定数量将行拆分为列的主要内容,如果未能解决你的问题,请参考以下文章

使RegEx组将行拆分为列

在pyspark中按时间差将行拆分为多个会话

使用 Oracle SQL 将可变长度分隔字符串拆分为列

将行拆分为多行 PL/SQL

根据持续时间将行拆分为多行

将行拆分为范围