Как получить номер приращения, если в столбце Bigquery есть какие-либо изменения?

# #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;