Как сравнить предыдущие и текущие строки в Google Bigquery? - PullRequest
1 голос
/ 17 февраля 2020

Мой пример таблицы сценариев выглядит следующим образом:

+-------------------------------+
| User | Time        | Property |
|------|-------------|----------| 
| u1   | 2020-02-01  |    p1    |
| u1   | 2020-02-02  |    p1    |
| u1   | 2020-02-03  |    p2    |
| u1   | 2020-02-04  |    p2    |
| u2   | 2020-02-01  |    p2    |
| u2   | 2020-02-02  |    p2    |
| u2   | 2020-02-04  |    p1    |
| u2   | 2020-02-05  |    p1    |
+-------------------------------+

Данные упорядочены по столбцам User и Time.

Я хочу добавить столбец следующим образом

+--------------------------------------------+
| User | Time        | Property | New_Column |
|------|-------------|----------|------------|
| u1   | 2020-02-01  |    p1    |  1         |
| u1   | 2020-02-02  |    p1    |  1         |
| u1   | 2020-02-03  |    p2    |  2         |
| u1   | 2020-02-04  |    p2    |  2         |
| u2   | 2020-02-01  |    p2    |  3         |
| u2   | 2020-02-02  |    p2    |  3         |
| u2   | 2020-02-04  |    p1    |  4         |
| u2   | 2020-02-05  |    p1    |  4         |
+--------------------------------------------+

Значение в New_Column уникально для последовательности непрерывных строк, пока не изменится User или Property.


Редактировать 1:

Я пытаюсь построить логи c, которые вовремя используют предыдущее свойство для пользователя.

select 
  *
, lag(property,1) over (partition by User order by Time) as Prev_Property
from table
order by User, Time

Затем я добавил столбец Row_Number Это дает мне

+------------------------------------------------------------+
| User | Time        | Property | Prev_Property | Row_Number |
|------|-------------|----------|---------------|------------|
| u1   | 2020-02-01  |    p1    |  Null         | 1          |
| u1   | 2020-02-02  |    p1    |  p1           | 2          |
| u1   | 2020-02-03  |    p2    |  p1           | 3          |
| u1   | 2020-02-04  |    p2    |  p2           | 4          |
| u2   | 2020-02-01  |    p2    |  Null         | 5          |
| u2   | 2020-02-02  |    p2    |  p2           | 6          |
| u2   | 2020-02-04  |    p1    |  p2           | 7          |
| u2   | 2020-02-05  |    p1    |  p1           | 8          |
+------------------------------------------------------------+

Я попытался построить логи c следующим образом

CASE
  WHEN Prev_Property is not null
  THEN Row_Number
  WHEN Property <> Prev_Property
  THEN Row_Number
  WHEN Property = Prev_Property
  THEN   -- a logic that gives me the Row_Number of the Prev_Property

Я все еще пытаюсь построить несколько последних условий в моем запросе. Пока это моя попытка.

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

1 Ответ

1 голос
/ 17 февраля 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT * EXCEPT(flag),
  COUNTIF(flag) OVER(ORDER BY User, Time) New_Column 
FROM (
  SELECT *, 
    (User, Property) != LAG((User, Property)) OVER(ORDER BY User, Time) flag
  FROM `project.dataset.table`
)

Вы можете проверить, поиграть с выше, используя фиктивные данные из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'u1' User, DATE '2020-02-01' Time, 'p1' Property UNION ALL
  SELECT 'u1', '2020-02-02', 'p1' UNION ALL
  SELECT 'u1', '2020-02-03', 'p2' UNION ALL
  SELECT 'u1', '2020-02-04', 'p2' UNION ALL
  SELECT 'u2', '2020-02-01', 'p2' UNION ALL
  SELECT 'u2', '2020-02-02', 'p2' UNION ALL
  SELECT 'u2', '2020-02-04', 'p1' UNION ALL
  SELECT 'u2', '2020-02-05', 'p1' 
)
SELECT * EXCEPT(flag),
  COUNTIF(flag) OVER(ORDER BY User, Time) New_Column 
FROM (
  SELECT *, 
    (User, Property) != LAG((User, Property)) OVER(ORDER BY User, Time) flag
  FROM `project.dataset.table`
)
-- ORDER BY User, Time  

с выводом

Row User    Time        Property    New_Column   
1   u1      2020-02-01  p1          0    
2   u1      2020-02-02  p1          0    
3   u1      2020-02-03  p2          1    
4   u1      2020-02-04  p2          1    
5   u2      2020-02-01  p2          2    
6   u2      2020-02-02  p2          2    
7   u2      2020-02-04  p1          3    
8   u2      2020-02-05  p1          3    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...