Группировать смежные строки в PostgreSQL - PullRequest
0 голосов
/ 11 ноября 2018

Учитывая эту таблицу:

| i | x |
+---+---+
| 1 | A |
| 2 | A |
| 3 | B |
| 4 | B |
| 5 | B |
| 6 | B |
| 7 | A |
| 8 | A |
| 9 | A |

Как можно сгруппировать строки, которые имеют одинаковую букву (в столбце x), чтобы получить следующий вывод?

| x | c |
+---+---+
| A | 2 |
| B | 4 |
| A | 3 |

Кроме того, я хотел бы вывести количество строк, которые были сгруппированы (показано в столбце c).

Я пробовал следующий запрос SQL:

SELECT x, count(*) c
FROM table_name
GROUP BY x

Этот запрос группирует все строки с одинаковым значением, и это не то, что я хочу, потому что результат не соответствует желаемому. Обе группы А сгруппированы в одну вместо того, чтобы держать их отдельно.

| x | c |
+---+---+
| A | 5 |
| B | 4 |

1 Ответ

0 голосов
/ 11 ноября 2018

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

Острова и пробелы появляются во всех видах последовательностей, будь то столбцы с номерами строк, где некоторые строки были удалены, или даты, встречающиеся в последовательности (но некоторые отсутствуют).

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

select X,COUNT(grp) c
from (
   SELECT *,  
          ROW_NUMBER() OVER(ORDER BY i) -  ROW_NUMBER() OVER(PARTITION BY X ORDER BY i) grp
   FROM table_name
) t1
group by grp,X

sqlfiddle

Результат

x   c
=====
A   2
B   4
A   3
...