Получение следующего результата с отметкой времени до t ie до предыдущего результата - PullRequest
1 голос
/ 05 августа 2020

Моя таблица в BigQuery выглядит так

+--------------------+------------+--------+--------+
|     TimeStamp      |  Session   |  Type  | Result |
+--------------------+------------+--------+--------+
| 7/28/2020 16:05:02 | 1595952288 | Select |  53402 |
| 7/28/2020 16:05:16 | 1595952288 | Menu   |      2 |
| 7/28/2020 16:05:25 | 1595952288 | Select |  53405 |
| 7/28/2020 16:05:36 | 1595952288 | Menu   |      1 |
+--------------------+------------+--------+--------+

Я хотел бы получить данные, чтобы они выглядели так, как показано ниже

+--------------------+------------+--------+--------+---------+
|     TimeStamp      |  Session   |  Type  | Result | Confirm |
+--------------------+------------+--------+--------+---------+
| 7/28/2020 16:05:02 | 1595952288 | Select |  53402 |       2 |
| 7/28/2020 16:05:25 | 1595952288 | Select |  53405 |       1 |
+--------------------+------------+--------+--------+---------+

В основном, что это за данные человек находится в Сессии в приложении, он вводит номер 5 di git, затем его просят подтвердить его.

  • Номер Five-di git будет под Type = Select
  • 1 или 2 будут в меню Type =, 1 - это подтверждено, 2 - неверно, и они хотят повторно ввести 5 di git число

Я пытаюсь t ie в следующей строке к числу 5 di git на основе следующей отметки времени и перенести его в ту же строку, чтобы сообщить об этом.

Вот SQL, который я создал, не думаю, что он правильный, так как он производит дубликаты. Я думаю, что есть способ получше, но он не очень эффективен. На самом деле, это может быть просто неправильно.

Select DISTINCT 
table1.Session, 
table1.Result, 
subtable1.Confirm

FROM 
`googleBQ_table` as table1
Left Join (
Select 
Result as Confirm,
Session,
MAX(TimeStamp)


FROM 
`googleBQ_table` 

WHERE Type =  'Menu' and LENGTH(Result) < 2

group by 1,2) as sub_table1 on sub_table1.Session = table1.Session


WHERE
table1.Session = '1595952288' and LENGTH(table1.Result) = 5

Заранее благодарю

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Предполагая, что строки «select» и «menu» правильно чередуются, вы можете использовать оконные функции:

select timestamp, session, type, result, lead_result confirm
from (
    select 
        t.*, 
        lead(case when type = 'Menu' then result end) 
            over(partition by session order by timestamp) lead_result
    from `googleBQ_table` t
) t
where type = 'Select'
0 голосов
/ 06 августа 2020

Ниже для BigQuery Standard SQL

в рамках сеанса в приложении они вводят номер 5 di git, затем их просят подтвердить это.

на основе вышеизложенного - я предполагаю, что строка подтверждения всегда находится после выбранной строки - поэтому ниже это делается

#standardSQL
SELECT * FROM (
  SELECT *, LEAD(result) OVER(confirmation) Confirm 
  FROM `project.dataset.table`
  WINDOW confirmation AS (PARTITION BY session ORDER BY TimeStamp)
) 
WHERE type = 'Select'   

, если применяется к образцам данных из вашего вопроса - результат

Row TimeStamp           Session     Type    Result  Confirm  
1   7/28/2020 16:05:02  1595952288  Select  53402   2    
2   7/28/2020 16:05:25  1595952288  Select  53405   1   
...