【问题标题】:Postgres - How to convert row with an int range into intermediate rows from individual values from that range?Postgres - 如何将具有 int 范围的行转换为该范围内单个值的中间行?
【发布时间】:2021-05-05 16:09:30
【问题描述】:

初始输入:

CREATE TABLE TEST_TABLE(
   start_i INT,
   end_i INT,
   v REAL
);

INSERT INTO TEST_TABLE (start_i, end_i, v) 
VALUES (300,305,0.5),
(313,316,0.25)
start_i end_i v
300 305 0.5
313 316 0.25

期望的结果:

基本上,我想创建中间行,其中包含一个附加列,其中包含初始表中显示的范围内的每个值。

i start_i end_i v
300 300 305 0.5
301 300 305 0.5
302 300 305 0.5
303 300 305 0.5
304 300 305 0.5
305 300 305 0.5
313 313 316 0.25
314 313 316 0.25
315 313 316 0.25
316 313 316 0.25

我查看了this 的帖子,但它是针对 SQL Server 的,而我对 Postgres 很感兴趣。另外,我没有使用日期列类型,而是使用整数。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    使用generate_series():

    select gs.i, t.*
    from t cross join lateral
         generate_series(start_i, end_i, 1) gs(i);
    

    严格来说,lateral 是不需要的。但它确实解释了发生了什么。我还应该注意,您也可以这样做:

    select generate_series(start_i, end_i) as i, t.*
    from t;
    

    但是,generate_series() 会影响查询中的行数。我对在 SELECT 子句中有这样的效果感到不舒服。

    【讨论】:

    • 感谢您的快速回复!关于您最后的评论,您的意思是使用generate_series 会降低性能吗?
    • @sqlquestionasker 。 . .不。在select 中有一个函数会影响结果集中的行数,这很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 2022-06-20
    • 2021-11-08
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多