Есть ли способ сгруппировать данные меток времени по 30-дневным интервалам, начиная с минимальной (дата), и добавить их в виде столбцов - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь использовать значение min () временной метки в качестве отправной точки, а затем группировать данные по 30-дневным интервалам, чтобы получить количество вхождений для каждого уникального значения в диапазоне дат временной метки в виде столбцов

У меня есть две таблицы, которые я объединяю, чтобы получить счет. Таблица 1 (page_creation) имеет 2 столбца, помеченных как link и dt_crtd. Таблица 2 (посещения страниц) имеет 2 других столбца, помеченных как URL и дата. таблицы объединяются путем соединения table1.link = table2.pagevisits.

После объединения я получаю таблицу, похожую на эту:

+-------------------+------------------------+
| url               |     date               |
+-------------------+------------------------+
| www.google.com    | 2018-01-01 00:00:00'   |
| www.google.com    | 2018-01-02 00:00:00'   |
| www.google.com    | 2018-02-01 00:00:00'   |
| www.google.com    | 2018-02-05 00:00:00'   |
| www.google.com    | 2018-03-04 00:00:00'   |
| www.facebook.com  | 2014-01-05 00:00:00'   |
| www.facebook.com  | 2014-01-07 00:00:00'   |
| www.facebook.com  | 2014-04-02 00:00:00'   |
| www.facebook.com  | 2014-04-10 00:00:00'   |
| www.facebook.com  | 2014-04-11 00:00:00'   |
| www.facebook.com  | 2014-05-01 00:00:00'   |
| www.twitter.com   | 2016-02-01 00:00:00'   |
| www.twitter.com   | 2016-03-04 00:00:00'   |
+---------------------+----------------------+

что я пытаюсь получить, это результаты, которые вытягивают это:

+-------------------+------------------------+------------+------------+-------------+
| url               | MIN_Date               | Interval 1  | Interval 2|  Interval 3 |
+-------------------+------------------------+-------------+-----------+-------------+
| www.google.com    | 2018-01-01 00:00:00'   |  2          |  2        |  1      
| www.facebook.com  | 2014-01-05 00:00:00'   |  2          |  0        |  1
| www.twitter.com   | 2016-02-01 00:00:00'   |  1          |  1        |  0    
+---------------------+----------------------+-------------+-----------+-------------+

Таким образом, 30-дневные интервалы начинаются с минимальной (даты), как показано в интервале 1, и считаются каждые 30 дней.

Я посмотрел на другие вопросы, такие как:

Группировка строк с интервалом в 7 дней, начиная с определенной даты

Запрос MySQL для выбора минимальной даты и времени, сгруппированных по 30-дневным интервалам

Однако это не отвечало моей конкретной проблеме.

Я также изучил синтаксис сводки, но заметил, что он поддерживается только для определенных СУБД.

Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Если вы используете BigQuery, я бы порекомендовал:

  • countif() для подсчета логического значения
  • timestamp_add() для добавления интервалов к временным меткам

Точные границы немного расплывчаты, но я бы сказал:

select pc.url,
       countif(pv.date >= pc.dt_crtd and
               pv.date < timestamp_add(pc.dt_crtd, interval 30 day
              ) as Interval_00_29,    
       countif(pv.date >= timestamp_add(pc.dt_crtd, interval 30 day) and
               pv.date < timestamp_add(pc.dt_crtd, interval 60 day
              ) as Interval_30_59,    
       countif(pv.date >= timestamp_add(pc.dt_crtd, interval 60 day) and
               pv.date < timestamp_add(pc.dt_crtd, interval 90 day
              ) as Interval_60_89
from page_creation pc join
     page_visits pv
     on pc.link = pv.url
group by pc.url
0 голосов
/ 04 января 2019

То, как я читаю ваш сценарий, особенно на примере After the join i get a table similar to ..., заключается в том, что у вас есть две таблицы, которые вам нужно UNION, а не JOIN

Итак, на основании приведенного ниже прочтения приведен пример для SQL BigQuery Standard (project.dataset.page_creation и project.dataset.page_visits здесь только для того, чтобы имитировать ваши таблицы 1 и таблицы 2)

#standardSQL
WITH `project.dataset.page_creation` AS (
  SELECT 'www.google.com' link, TIMESTAMP '2018-01-01 00:00:00' dt_crtd UNION ALL
  SELECT 'www.facebook.com', '2014-01-05 00:00:00' UNION ALL
  SELECT 'www.twitter.com', '2016-02-01 00:00:00' 
), `project.dataset.page_visits` AS (
  SELECT 'www.google.com' url, TIMESTAMP '2018-01-02 00:00:00' dt UNION ALL
  SELECT 'www.google.com', '2018-02-01 00:00:00' UNION ALL
  SELECT 'www.google.com', '2018-02-05 00:00:00' UNION ALL
  SELECT 'www.google.com', '2018-03-04 00:00:00' UNION ALL
  SELECT 'www.facebook.com', '2014-01-07 00:00:00' UNION ALL
  SELECT 'www.facebook.com', '2014-04-02 00:00:00' UNION ALL
  SELECT 'www.facebook.com', '2014-04-10 00:00:00' UNION ALL
  SELECT 'www.facebook.com', '2014-04-11 00:00:00' UNION ALL
  SELECT 'www.facebook.com', '2014-05-01 00:00:00' UNION ALL
  SELECT 'www.twitter.com', '2016-03-04 00:00:00' 
), `After the join` AS (
  SELECT url, dt FROM `project.dataset.page_visits` UNION DISTINCT
  SELECT link, dt_crtd FROM `project.dataset.page_creation`
)
SELECT 
  url, min_date, 
  COUNTIF(dt BETWEEN min_date AND TIMESTAMP_ADD(min_date, INTERVAL 29 DAY)) Interval_1,
  COUNTIF(dt BETWEEN TIMESTAMP_ADD(min_date, INTERVAL 30 DAY) AND TIMESTAMP_ADD(min_date, INTERVAL 59 DAY)) Interval_2,
  COUNTIF(dt BETWEEN TIMESTAMP_ADD(min_date, INTERVAL 60 DAY) AND TIMESTAMP_ADD(min_date, INTERVAL 89 DAY)) Interval_3
FROM (
  SELECT url, dt, MIN(dt) OVER(PARTITION BY url ORDER BY dt) min_date
  FROM `After the join`
)
GROUP BY url, min_date

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

Row url                 min_date                    Interval_1  Interval_2  Interval_3   
1   www.facebook.com    2014-01-05 00:00:00 UTC     2           0           1    
2   www.google.com      2018-01-01 00:00:00 UTC     2           2           1    
3   www.twitter.com     2016-02-01 00:00:00 UTC     1           1           0    
0 голосов
/ 03 января 2019

Если я ясно понял ваш вопрос, вы хотите рассчитать посещения страниц с интервалом 30, 60, 90 дней после создания страницы.Если это требование, попробуйте ниже код SQL: -

select a11.url
,Sum(case when a12.date between a11.dt_crtd and a11.dt_crtd+30 then 1 else 0) Interval_1    
,Sum(case when a12.date between a11.dt_crtd+31 and a11.dt_crtd+60 then 1 else 0) Interval_2
,Sum(case when a12.date between a11.dt_crtd+61 and a11.dt_crtd+90 then 1 else 0) Interval_3 
from page_creation a11
join page_visits a12
on a11.link = a12.url
group by a11.url
...