# #sql #google-bigquery
Вопрос:
У меня есть данные date, id, and flag
по этой таблице. Как я могу получить value
столбец, в котором этот столбец является инкрементным числом, и сбросить значение с 1 при любых изменениях в flag
столбце?
Ответ №1:
Рассмотрим следующий подход
select * except(changed, grp),
row_number() over(partition by id, grp order by date) value
from (
select *, countif(changed) over(partition by id order by date) grp
from (
select *,
ifnull(flag != lag(flag) over(partition by id order by date), true) changed
from `project.dataset.table`
))
если применить к образцам данных в вашем вопросе — вывод будет
Ответ №2:
Вы, кажется, хотите посчитать количество false
s с момента последнего true
. Вы можете использовать:
select t.* except (grp),
(case when flag
then 1
else row_number() over (partition by id, grp order by date) - 1
end)
from (select t.*,
countif(flag) over (partition by id order by date) as grp
from t
) t;
Если вы знаете, что в датах нет пробелов, вы действительно можете сделать это без подзапроса:
select t.*,
(case when flag then 1
else date_diff(date,
max(case when flag then date end) over (partition by id),
day)
end)
from t;