Оператор CASE для создания другого окна в разделе в BQ на основе строки отставания / опережения - PullRequest
2 голосов
/ 10 марта 2019

Я пытаюсь выполнить sql-запрос, который создаст группы в заказе, основываясь на том, будет ли следующая строка на 0,01 секунды позже.

Для проекта, над которым я работаю, у меня есть фиктивные данные со временемсотовый телефон был проверен во время различных приложений.Мы должны рассчитать различные метрики, и если телефон не пингуется в течение нескольких секунд, это должна быть другая группа.

enter image description here

SELECT APP_ID, 
Session_id, 
Phone_id, 
Time_pinged, 
LAG(Time_pinged,1) 
OVER(PARTITION BY App_id, Session_id, Phone_id order by Time_pinged) as Lag_time,
LEAD(Time_pinged,1)
OVER(PARTITION BY App_id, Session_id, Phone_id order by Time_pinged) as Lead_time
FROM Mydataset.app_data

Iя пытаюсь добавить еще одну «группировку» в этот запрос, чтобы учесть, что сеанс теряет соединения на несколько миллисекунд, поэтому, хотя последние 2 строки находятся в одном и том же session_id, он потерял соединение на миллисекунду, поэтому должно быть 2 уникальные группыв этом сеансе.

Я пытаюсь выяснить, как сделать оператор case, где я мог бы создать другую группировку в Session_id (для данного приложения / пользователя) на основе этой формулы: lead (time_pinged, 1) -time_pinged! = .01

Моей первоначальной мыслью было создание начальных / конечных «окон», которые бы говорили: If: time_pinged - lag(time_pinged,1) != .01 -> start frame And case lead(time_pinged,1) - time_pinged != .01 -> end frame.Теперь я не думаю, что мне нужны оба этих случая, потому что, если я знаю конечные кадры, я знаю начальные кадры, но я не уверен.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT App_id, Session_id, Phone_id, Time_pinged, 
  COUNTIF(new_group) OVER(PARTITION BY App_id, Session_id, Phone_id ORDER BY Time_Pinged) sub_session
FROM (
  SELECT App_id, Session_id, Phone_id, Time_pinged, 
    CAST(Time_pinged - LAG(Time_pinged) OVER(PARTITION BY App_id, Session_id, Phone_id ORDER BY Time_Pinged) as NUMERIC) > 0.01 new_group
  FROM `project.dataset.table`
)

Если запустить выше пример данных в вашем вопросе - результат

Row App_id  Session_id  Phone_id    Time_pinged sub_session  
1   AppA    g12_ab      89002       0.01        0    
2   AppA    g12_ab      89002       0.02        0    
3   AppA    g12_ab      89002       0.03        0    
4   AppA    g12_ab      89002       0.04        0    
5   AppA    g12_ab      89002       0.08        1    
6   AppA    g12_ab      89002       0.09        1    
1 голос
/ 10 марта 2019

сделать накопительную сумму.То есть используйте lag(), чтобы определить, где начинаются группы, а затем назначьте номер группы на основе совокупной суммы.

SELECT ad.*,
       COUNTIF( lag_time < time_pinged - 0.015 ) OVER (PARTITOIN BY App_id, Session_id, Phone_id) as grp 
FROM (SELECT ad.*
             LAG(Time_pinged, 1) OVER (PARTITION BY App_id, Session_id, Phone_id ORDER BY Time_pinged) as Lag_time,
      FROM Mydataset.app_data ad
     ) ad;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...