Рассчитать общее количество времени, проведенного на сайте группы по уникальному идентификатору - PullRequest
0 голосов
/ 02 июля 2019

У меня есть пара идентификаторов пользователей и время, которое они видят каждый час.Я хочу рассчитать сумму времени, потраченного каждым пользователем (время безотказной работы), но исключая каждую точку данных, которая опаздывает на 60 минут, что означает, что следует избегать любой отметки времени, которая превышает 120 минут, чем предыдущая.и, наконец, сгруппировать в один день, извлеченный из самой метки времени.Я также беру частоту соединения, называя ее отключенной, если в данных виден разрыв более 2 или более часов, и увеличиваю счет на 1. Это определяет частоту соединения.Помните, что запрос написан для BigQuery.

  1. промежуток времени от 120 минут до 1440 минут (от 2 часов до 24 часов рассматривается как разрыв между данными и должен игнорироваться из суммы вычислений затрат времени, но времени соединениядолжен быть увеличен на 1, потому что это будет считаться отключением)
    unique_id         server_time
    50J181700696    2019-07-02 00:14:14.157 UTC
    50J181700696    2019-07-02 01:14:14.136 UTC
    50J181700696    2019-07-02 02:14:14.116 UTC
    50J181700696    2019-07-02 04:14:14.065 UTC
    50J181700696    2019-07-02 05:14:14.041 UTC
    50J181700696    2019-07-02 07:14:13.987 UTC
    50J181700696    2019-07-02 08:14:13.961 UTC
    50J181700696    2019-07-02 11:14:13.873 UTC
    50J181700696    2019-07-02 12:14:13.852 UTC
    50J181700696    2019-07-02 13:14:13.822 UTC
    SELECT
      date_column,
      unique_id,
      SUM(
      case TIMESTAMP_DIFF(prev_server_time,server_time,minute) between 0 and 120
            when server_time is null or prev_server_time is null then 0
            when server_time > prev_server_time then TIMESTAMP_DIFF(server_time,prev_server_time,minute)
            else 0 
           END
      ) AS uptime_per_day,
      SUM(
      case not (TIMESTAMP_DIFF(prev_server_time,server_time,minute) between 0 and 120 )
            when prev_server_time is null or server_time is null then 0
            when server_time > prev_server_time and TIMESTAMP_DIFF(server_time,prev_server_time,minute) between 120 and 1440 then 1
            else 0 
           END
      ) AS connection_times
    FROM (
      SELECT
        date_column,
        unique_id,
        server_time,
        LAG(server_time ) OVER (PARTITION BY unique_id ORDER BY date_column   ) AS prev_server_time
      FROM (
        SELECT
          unique_id,
          server_time,
          DATE(server_time) AS date_column
        FROM
          `table_user_entry`
        ))
    GROUP BY
      date_column,
      unique_id
date_column unique_id      uptime_per_day(minutes) connection_times
2019-07-02  50J181700696      420                       3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...