Size: a a a

2021 February 12

ПФ

Паша Финкельштейн... in Moscow Spark
Так, ладно, а как на SQL посчитать?
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Алексей
BETWEEN 2 PRECEDING AND CURRENT ROW
Вот это ты определение окна написал, а что дальше?
источник

GT

Gennady Timofeev in Moscow Spark
Паша Финкельштейн
типа select count(x) where x=3
SUM(CASE WHEN X=3 THEN 1 ELSE 0)
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Gennady Timofeev
SUM(CASE WHEN X=3 THEN 1 ELSE 0)
Я тут примерчик привёл https://t.me/moscowspark/14117 а то нифига непонятно что я имел в виду
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Так, array($"_2").over(timeWindow) нельзя :(
источник

А

Алексей in Moscow Spark
ничего лучше, чем черзе лаг не придумал, возможно будет 2 шафла, но не факт:
with data as (select 1 as col1, 'a' as col2 union all select 2 as col1, 'b' as col2 union all select 3 as col1, 'a' as col2)
select d.* , case when d.col2 = lag(col2) over(order by col1) then 1 else 0 end + case when d.col2 = lag(col2,2) over(order by col1) then 1 else 0 end as cnt
from data d
источник

ПФ

Паша Финкельштейн... in Moscow Spark
да, два лага мне тоже в голову пришло, но это так себе решение в том плане, что а вдруг нам надо на 30 назад?
источник

VS

Vladislav 👻 Shishkov... in Moscow Spark
Gennady Timofeev
SUM(CASE WHEN X=3 THEN 1 ELSE 0)
count-1
источник

VS

Vladislav 👻 Shishkov... in Moscow Spark
У Паши пример же, где отсчет начинается с нуля
источник

А

Алексей in Moscow Spark
Паша Финкельштейн
да, два лага мне тоже в голову пришло, но это так себе решение в том плане, что а вдруг нам надо на 30 назад?
collect_list(col2) over(order by col1 RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING)
источник

VS

Vladislav 👻 Shishkov... in Moscow Spark
Ну и в окне "2" это хардкод, если я правильно задачу понял, надо окно от начала до текущего
источник

А

Алексей in Moscow Spark
ток потом массив еще надо прверить на колонку как то
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Vladislav 👻 Shishkov
Ну и в окне "2" это хардкод, если я правильно задачу понял, надо окно от начала до текущего
Не-не, у меня как раз фиксированного размера окно
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Но хоршо бы всё-таки иметь возможность его менять
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Ну типа и три, и пять выставить
источник

ПФ

Паша Финкельштейн... in Moscow Spark
просто я ленивый и пример написал только на три строки
источник

VS

Vladislav 👻 Shishkov... in Moscow Spark
Как же сложно ты формулируешь задачу 🙈
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Блин, она сложная просто!
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Добавил ещё строку для понятности
источник

А

Алексей in Moscow Spark
Паша Финкельштейн
Блин, она сложная просто!
о, а так?
with data as (select 1 as col1, 'a' as col2 union all select 2 as col1, 'b' as col2 union all select 3 as col1, 'a' as col2)
select *,
size(filter(collect_list(col2) over(order by col1 RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING), x -> col2 == x)) as col_arr
from data d
источник