Объединить строки (одинаковые значения) в PostgreSQL на основе разницы строк - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть таблица my_tbl в моей базе данных PostgreSQL 9.5 (x64 Windows), которая содержит данные, как показано ниже.

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 / PLPG SQL * * 1014

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете использовать функцию ARRAY_AGG и Функция FIRST_VALUE :

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;

DB Fiddle

...