Количество идущих подряд одинаковых записей PostgreSQL
| one | two | three |
|---|---|---|
| a | abs1 | true |
| a | abs2 | true |
| a | abs3 | false |
| a | abs4 | true |
| b | abs1 | true |
| b | abs2 | false |
| b | abs3 | true |
Нужно из этой таблички получить следующую:
| one | count |
|---|---|
| a | 2 |
| b | 1 |
То есть подсчитать максимальное количество подряд идущих одинаковых записей в первом столбце, которые в третьем имеют статус "true"
Ответы (1 шт):
Автор решения: Arkee
→ Ссылка
Можно оформить через LAG() - изменение фиксируем просто сравнивая текущую и предыдущую строку в столбце three. Пример:
WITH tempTable (
one,
two,
three
)
AS (
SELECT 'a', 'abs1', true
UNION ALL
SELECT 'a', 'abs2', true
UNION ALL
SELECT 'a', 'abs3', false
UNION ALL
SELECT 'a', 'abs4', true
UNION ALL
SELECT 'b', 'abs1', true
UNION ALL
SELECT 'b', 'abs2', false
UNION ALL
SELECT 'b', 'abs3', true
)
SELECT
s.one,
COUNT(*) AS count
FROM
(
SELECT
LAG(three) OVER (PARTITION BY one) prevThree,
one,
two,
three
FROM
tempTable t
) s
WHERE
s.prevThree = s.three
OR s.prevThree IS NULL
GROUP BY
s.one