Вычисление time_diff между строками с одинаковым идентификатором в GoogleBigQuery - PullRequest
0 голосов
/ 04 декабря 2018

Я практикую свои навыки SQL с BigQuery и пытаюсь рассчитать разницу во времени между арендными ставками для каждого велосипеда.По сути, я хочу рассчитать time_diff для каждого отдельного идентификатора, для каждой пары строк с одинаковым идентификатором велосипеда.Я пытаюсь найти медиану распределения time_diff для каждого велосипеда. Сейчас у меня есть:

SELECT bikeid,
       DATE_DIFF(date(start_time), date(prev_start_time), day) AS Tempo,
       OrderCount
FROM ( SELECT bikeid,
              start_time, 
              ROW_NUMBER() OVER(PARTITION BY bikeid ORDER BY start_time ASC) OrderCount,
              LAG(start_time) OVER(PARTITION BY bikeid ORDER BY start_time ASC) prev_start_time
       FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` 
     ) 
ORDER BY bikeid, start_time 

Я использую общедоступный набор данных BigQuery bigquery-public-data.austin_bikeshare.bikeshare_trips, и мой результат странный, потому чтоне показывать ни одного идентификатора велосипеда (я уже ожидаю много нулей (0) в качестве date_diff, потому что база данных регистрирует метки времени, и иногда велосипед сдается в аренду много раз за один день).

    | Linha | bikeid | Tempo | OrderCount |
    |   1   |  null  | null  |     1      |
    |   2   |  null  |  57   |     2      |
    |   3   |  null  |  1    |     3      |

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В колонке байков много нулей.Вы видите нули, потому что порядок ASC сначала будет получать нули.Есть несколько вариантов, которые вы можете выбрать. • Вы можете изменить свой заказ по предложению на DESC для bikeid. SELECT bikeid, DATE_DIFF (date (start_time), date (prev_start_time), day) AS Tempo, OrderCount FROM (SELECT bikeid, start_time, ROW_NUMBER ()OVER (PARTITION by bikeid ORDER BY start_time ASC) OrderCount, LAG (start_time) OVER (PARTITION BY bikeid ORDER BY start_time ASC) prev_start_time FROM bigquery-public-data.austin_bikeshare.bikeshare_trips
)
ORDER BY bikeid desc, start_time • Вы можете удалить нулевой bikeidдобавив оператор where, где bikeid не равен NULL, выберите SELECT bikeid, DATE_DIFF (дата (start_time), дата (prev_start_time), день) AS Tempo, OrderCount FROM (SELECT bikeid, start_time, ROW_NUMBER () OVER (PARTITION BY bikeid ORDER BY start_timeASC) OrderCount, LAG (start_time) OVER (PARTITION BY bikeid ORDER BY start_time ASC) prev_start_time FROM bigquery-public-data.austin_bikeshare.bikeshare_trips
где bikeid не равен нулю)
ORDER BY OrderCount desc, bikeid desc, start_time

0 голосов
/ 04 декабря 2018

Среднее значение - это общая разница, деленная на единицу меньше, чем количество аренды.Таким образом, вам не нужны оконные функции:

SELECT bikeid,
       DATE_DIFF(MAX(DATE(start_time)), MIN(DATE(start_time)), day) / NULLIF(COUNT(*) - 1, 0) as avg_period
FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips` 
GROUP BY bikeid ;

Выше исправляет ваш запрос и отвечает на ваш вопрос.Я не уверен, что он делает что-то полезное, потому что велосипеды сдаются в аренду несколько раз в день (в этом суть программы проката велосипедов общего пользования).

По крайней мере, вы можете использовать меньшую единицувремя:

SELECT bikeid,
       TIMESTAMP_DIFF(MAX(start_time), MIN(start_time), second) / NULLIF(COUNT(*) - 1, 0) as avg_period_in_seconds
FROM  `bigquery-public-data.austin_bikeshare.bikeshare_trips` 
GROUP BY bikeid ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...