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
. Фикс офф-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 <> fiddle здесь