count(
expression
)
не считает значения NULL, будь то агрегатная функция или оконная функция. Руководство:
количество входных строк, для которых значение выражения не равно нулю
Это ключевой элемент для простого и быстрого запроса.
Предполагая, что transaction_date
равно UNIQUE
, как предлагает ваш пример, или вам нужно будет определить, как разорвать связи между повторяющимися значениями. (Фактическое определение таблицы могло бы прояснить ситуацию.)
SELECT transaction_date, transaction_sale
, CASE WHEN transaction_sale IS NOT NULL
THEN count(*) OVER (PARTITION BY grp) - 1
END AS count
FROM (
SELECT *
, count(transaction_sale) OVER (ORDER BY transaction_date DESC) AS grp
FROM tbl
) sub
ORDER BY transaction_date;
Формируйте группы в подзапросе. Поскольку каждое ненулевое значение запускает новую группу в соответствии с вашим определением, просто подсчитайте фактические значения в порядке убывания в оконной функции, чтобы эффективно присвоить номер группы каждой строке. Остальное тривиально.
Во внешнем SELECT
подсчитайте строки в группе и отобразите где transaction_sale IS NOT NULL
. Исправить off-by-1. Вуаля.
Связанный:
В качестве альтернативы, подсчитайте с FILTER (WHERE transaction_sale IS NULL)
- полезно для связанных случаев, когда мы не можем просто вычесть 1:
SELECT transaction_date, transaction_sale
, CASE WHEN transaction_sale IS NOT NULL
THEN count(*) FILTER (WHERE transaction_sale IS NULL)
OVER (PARTITION BY grp)
END AS count
FROM (
SELECT *
, count(transaction_sale) OVER (ORDER BY transaction_date DESC) AS grp
FROM tbl
) sub
ORDER BY transaction_date;
О предложении FILTER
:
db ‹> скрипт здесь
person
Erwin Brandstetter
schedule
30.09.2019
lag
вычисление отката функции - person maSTAShuFu   schedule 30.09.2019