首页 > 解决方案 > Postgres - 如何将具有 int 范围的行转换为该范围内单个值的中间行?

问题描述

初始输入:

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)
开始我 end_i v
300 305 0.5
313 316 0.25

期望的结果:

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

一世 开始我 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

我已经检查过这篇文章,但它是针对 SQL Server 的,而我对 Postgres 很感兴趣。另外,我没有使用日期列类型,而是使用整数。

标签: sqlpostgresql

解决方案


使用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条款中有这样的影响感到不舒服。


推荐阅读