sql - 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 很感兴趣。另外,我没有使用日期列类型,而是使用整数。
解决方案
使用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
条款中有这样的影响感到不舒服。
推荐阅读
- reactjs - reactJS - TypeError: Cannot call a class as a function
- redis - 用windows安装文件打包redis
- php - OAI 验证错误
- r - 无法在包“SparkR”中加载 R 代码
- javascript - 在 JavaScript 中使用 ViewPort 作为单位
- android - SQLITE FTS 匹配中文本出现的实际数量
- webpack - Webpack 4 - 非 NPM 供应商目录
- postgresql - 在 postgresql 中使用 execute 将列数据存储在数组中
- sql-server - 约束/索引如何减慢插入速度
- apache-kafka - 为 iOS 构建 librdkafa 静态库