Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于行差异合并PostgreSQL中的行(相同值)_Postgresql_Merge_Row - Fatal编程技术网

基于行差异合并PostgreSQL中的行(相同值)

基于行差异合并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

我的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   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;