Группа последовательных целых чисел postgres - PullRequest
0 голосов
/ 31 августа 2018

У меня есть запрос, который возвращает:

1
2
5
7
8

Я бы хотел сгруппировать строки следующим образом:

{1,2}
{5}
{7,8}

Другими словами, мне нужно сгруппировать последовательные значения.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

На основании вашего ответа на причину необходимости, что вы пытаетесь найти поврежденные последовательности в таблице. Я бы назвал такие пробелы. Это не дает вам явно то, что вы просили, но то, что вы просили, немного сложнее.

select col1 
from mytable S 
where not exists 
  (select col1 
   from mytable T 
   where T.col1 = S.col1 + 1)

Это вернет последний номер, который был последовательным в каждом наборе перед разрывом.

Чтобы получить именно то, что вам нужно, вы можете использовать результаты этой таблицы и некоторые between операторы, чтобы в конечном итоге получить ваш явный запрос или что-то более сложное. Вы можете слишком обдумать это.

0 голосов
/ 31 августа 2018

Похоже, что массив подойдет, поэтому:

select array_agg(col order by col)
from (select t.*, row_number() over (order by col) as seqnum
      from t
     ) t
group by (col - seqnum);

EDIT:

Если вы просто хотите начать и закончить, используйте max() и min():

select min(col), max(col)
from (select t.*, row_number() over (order by col) as seqnum
      from t
     ) t
group by (col - seqnum);
0 голосов
/ 31 августа 2018

Это проблема пробелов и островов.

Вы можете попытаться создать номер строки, а затем выполнить некоторое вычисление, чтобы получить group by число.

CREATE TABLE T(
   ID INT
);

INSERT INTO T VALUES (1);
INSERT INTO T VALUES (2);
INSERT INTO T VALUES (5);
INSERT INTO T VALUES (7);
INSERT INTO T VALUES (8);

Запрос 1 :

WITH CTE AS (
  SELECT Min(id) minid,MAX(ID) maxid
  FROM (
      SELECT ID,ID - ROW_NUMBER() OVER(ORDER BY ID) rn
      FROM T
  )t1
  group by rn
)
SELECT (CASE WHEN minid = maxid 
        THEN CAST(maxid AS VARCHAR(50)) 
        ELSE CONCAT(minid,',',maxid) 
       END) ID
FROM CTE
ORDER BY minid

Результаты :

|  id |
|-----|
| 1,2 |
|   5 |
| 7,8 |
...