按一定数量将行拆分为列
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【讨论】:
谢谢,有趣的想法)以上是关于按一定数量将行拆分为列的主要内容,如果未能解决你的问题,请参考以下文章