Количество идущих подряд одинаковых записей PostgreSQL

Рейтинг: 0Ответов: 1Опубликовано: 02.05.2023
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"

Ответы

▲ 0

Можно оформить через 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