基于行差异合并PostgreSQL中的行(相同值)
我的PostgreSQL 9.5(x64 Windows)数据库中有一个表基于行差异合并PostgreSQL中的行(相同值),postgresql,merge,row,Postgresql,Merge,Row,我的PostgreSQL 9.5(x64 Windows)数据库中有一个表my_tbl,其中包含如下所示的数据 grp id low high avg 1 7 292 322 18.8 1 8 322 352 18.8 1 9 352 22 18.8 1 10 22 52 18.8 1 11 52 82 18.8 1 12 82 112
my_tbl
,其中包含如下所示的数据
grp id low high avg
1 7 292 322 18.8
1 8 322 352 18.8
1 9 352 22 18.8
1 10 22 52 18.8
1 11 52 82 18.8
1 12 82 112 18.8
4 1 97 127 19.0
4 2 127 157 11.4
4 3 157 187 11.4
4 4 187 217 19.6
4 5 217 247 19.6
4 6 247 277 19.6
4 10 7 37 19.5
4 11 37 67 19.5
4 12 67 97 19.5
6 6 182 212 0.0
6 7 212 242 0.0
6 8 242 272 0.0
6 9 272 302 21.4
6 10 302 332 21.4
6 11 332 2 0.0
6 12 2 32 0.0
7 5 275 305 0.0
7 6 305 335 0.0
7 7 335 5 0.0
7 8 5 35 0.0
7 9 35 65 21.2
7 10 65 95 21.2
7 11 95 125 21.2
7 12 125 155 21.2
现在,我想用以下方式合并上述数据中的行。对于每个grp
,如果avg
值(前一行和后一行)之间的差值为零(相同值),则所有这些行应与第一行的low
值合并到最后一行的high
值(合并应停止)
我的预期产出是:
grp id low high avg
1 {7,8,9,10,11,12} 292 112 18.8
4 {1} 97 127 19.0
4 {2,3} 127 187 11.4
4 {4,5,6} 187 277 19.6
4 {10,11,12} 7 97 19.5
6 {6,7,8} 182 272 0.0
6 {9,10} 272 332 21.4
6 {11,12} 332 32 0.0
7 {5,6,7,8} 275 35 0.0
7 {9,10,11,12} 35 155 21.2
是否有人愿意就如何使用SQL/PLPGSQL实现这一目标提供帮助或建议?您可以使用和:
谢谢您的努力。我测试了代码,但它没有给出期望的输出。我还注意到您使用的样本值与我的完全不同,我已经提到了我的样本数据和所需的输出。我刚刚更新了解决方案。请再看一遍。在DB Fiddle中,我使用了部分数据进行简单测试,请阅读我上面的解释。我认为,需要检查行之间的差异,然后具有相同“avg”值的行需要与合并间隔的第一个低值和最后一个高值合并。请查看所需的输出。嗨,斯拉瓦,我测试了更新的代码。也许它适用于您使用的我的部分数据,但不适用于整个样本数据。请检查完整的数据,看看我是否错了:)。查看更新的小提琴完整的数据
SELECT
grp, ARRAY_AGG(id) AS id, low, high, avg
FROM (
SELECT
grp,
id,
FIRST_VALUE(low) OVER (PARTITION BY grp, avg ORDER BY id) AS low,
FIRST_VALUE(high) OVER (PARTITION BY grp, avg ORDER BY id DESC) AS high,
avg
FROM my_tbl ORDER BY id
) t
GROUP BY grp, avg , low, high
ORDER BY grp;