Разделение (сегрегация) по периоду времени в SQL - PullRequest
0 голосов
/ 29 сентября 2018

Мой вопрос состоит в том, чтобы отделить данные от информации о времени в SQL

У меня есть данные транзакций для трамваев.Примерно так:

DateTime
2018-04-03T08:06:04
2018-04-03T08:07:27
2018-04-03T08:18:18
2018-04-03T10:08:27
2018-04-03T10:22:24
2018-04-03T12:08:50
2018-04-03T12:24:49
2018-04-03T12:24:51

Это клиент , нажав на информацию для конкретного трамвая в определенный день.Это включает в себя 3 поездки на одном и том же трамвае

  1. Первая транзакция первого рейса в 8:06, вторая в 8:07 и третья в 8: 18
  2. Первая транзакция второго путешествия в10:08, секунда в 10: 22 * ​​1013 *
  3. Третья поездка Первая транзакция в 12:08, вторая в 12:24 и третья в 24: 24

Как их ранжироватькак 3 разных путешествия, так что желаемый результат будет таким:

Rank    DateTime
1   2018-04-03T08:06:04
1   2018-04-03T08:07:27
1   2018-04-03T08:18:18
2   2018-04-03T10:08:27
2   2018-04-03T10:22:24
3   2018-04-03T12:08:50
3   2018-04-03T12:24:49
3   2018-04-03T12:24:51

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

1 Ответ

0 голосов
/ 29 сентября 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT dt, 1 + SUM(start) OVER(ORDER BY dt) journey 
FROM (
  SELECT dt, IF(TIMESTAMP_DIFF(dt, LAG(dt) OVER(ORDER BY dt), MINUTE) > 40, 1, 0) start
  FROM `project.dataset.table`
)

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT TIMESTAMP '2018-04-03T08:06:04' dt UNION ALL
  SELECT '2018-04-03T08:07:27' UNION ALL
  SELECT '2018-04-03T08:18:18' UNION ALL
  SELECT '2018-04-03T10:08:27' UNION ALL
  SELECT '2018-04-03T10:22:24' UNION ALL
  SELECT '2018-04-03T12:08:50' UNION ALL
  SELECT '2018-04-03T12:24:49' UNION ALL
  SELECT '2018-04-03T12:24:51' 
)
SELECT dt, 1 + SUM(start) OVER(ORDER BY dt) journey 
FROM (
  SELECT dt, IF(TIMESTAMP_DIFF(dt, LAG(dt) OVER(ORDER BY dt), MINUTE) > 40, 1, 0) start
  FROM `project.dataset.table`
)
-- ORDER BY dt 

с результатом

Row dt                          journey  
1   2018-04-03 08:06:04 UTC     1    
2   2018-04-03 08:07:27 UTC     1    
3   2018-04-03 08:18:18 UTC     1    
4   2018-04-03 10:08:27 UTC     2    
5   2018-04-03 10:22:24 UTC     2    
6   2018-04-03 12:08:50 UTC     3    
7   2018-04-03 12:24:49 UTC     3    
8   2018-04-03 12:24:51 UTC     3      

Примечание: я вывел логику из приведенного ниже утверждения в вашем вопросе

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

Более подробная версия:

#standardSQL
SELECT dt, 1 + COUNTIF(start) OVER(ORDER BY dt) journey 
FROM (
  SELECT dt, (TIMESTAMP_DIFF(dt, LAG(dt) OVER(ORDER BY dt), MINUTE) > 40) start
  FROM `project.dataset.table`
)
ORDER BY dt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...