Средняя разница в часах для последовательных дат в случае, когда - PullRequest
0 голосов
/ 01 сентября 2018

Работаете в стандартном SQL / BQ, но пытаетесь найти способ получить среднюю разницу между двумя временными метками для каждого пользователя для последовательных дат?

Мои данные выглядят так:

    UserId  Login                      
    0       2016-07-14 14:43:30 +0000   
    2       2018-07-09 17:19:55 +0000   
    2       2018-07-10 20:38:37 +0000   
    2       2014-07-12 17:37:20 +0000
    2       2018-07-13 01:08:20 +0000   
    3       2015-12-04 17:17:41 +0000   
    3       2015-12-04 20:14:43 +0000   

Итак, на данный момент у меня есть:

  SELECT UserId
        ,CASE WHEN(
          (Magic)
          THEN AVG(TIMESTAMP_DIFF(Login2, Login, HOUR) ELSE NULL END))) AS hours
  FROM TABLE
  GROUP BY 1

(Волшебная) часть - это застрявшая часть, в которой я хотел бы указать, являются ли даты для каждого пользователя последовательными, затем взять разность последней даты входа в систему и вычесть ее до текущей даты входа в систему. Могу ли я применить задержку и сказать, что если разница между следующей датой и первой датой находится в пределах дня, то это последовательно? Или к этому есть подход с разделением / оконной функцией?

Login2 будет второй меткой времени входа в систему следующей последовательной даты.

Результаты, которые я хотел бы получить:

UserId      Average Hours between Consecutive Logins                      
    0       NULL 
    2       17.5 hours
    3       3 hours
  • Для UserId 0 это NULL, потому что нет второго времени входа в систему для сравнения.
  • Для UserId 2 он получает среднее значение между разницей в двух последовательных датах входа в систему (07/09 - 07/10 и 07/12 - 07/13) (27 часов + 8 часов / 2) = 5,5 часов
  • Для UserId 3 одна точка данных с тем же входным днем ​​с разницей в 3 часа, так что она соответствует условию последовательности, и получила среднюю разницу одной точки данных

1 Ответ

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

Ниже приведен пример для BigQuery Standard SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 0 UserId, TIMESTAMP '2016-07-14 14:43:30' Login UNION ALL   
  SELECT 2, '2018-07-09 17:19:55' UNION ALL   
  SELECT 2, '2018-07-10 20:38:37' UNION ALL   
  SELECT 2, '2018-07-12 17:37:20' UNION ALL
  SELECT 2, '2018-07-13 01:08:20' UNION ALL   
  SELECT 3, '2015-12-04 17:17:41' UNION ALL   
  SELECT 3, '2015-12-04 20:14:43' 
)
SELECT
  UserId,
  ROUND(AVG(IF(
      TIMESTAMP_DIFF(TIMESTAMP_TRUNC(next_Login, DAY), TIMESTAMP_TRUNC(Login, DAY), DAY) < 2,
      TIMESTAMP_DIFF(next_Login, Login, MINUTE), NULL
  ))/60, 2) average_hours
FROM (
  SELECT UserId, Login, 
    LEAD(Login) OVER(PARTITION BY UserId ORDER BY Login) next_Login
  FROM `project.dataset.table`
)
GROUP BY UserId
ORDER BY UserId   

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

Row     UserId      average_hours    
1       0           null     
2       2           17.41    
3       3           2.95          

Надеюсь, что вы сможете приспособиться выше к вашим особенностям, если таковые имеются

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...