Как получить количество идентификаторов в таблице 1 для текущего месяца, которые также присутствуют в таблице 2 для текущего месяца или текущего месяца + 1 или текущего месяца + 2 - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь получить количество идентификаторов, присутствующих в обеих таблицах 1 и 2, при условии, что идентификаторы, представленные в таблице 1 для определенного месяца, должны совпадать с идентификаторами, представленными в таблице 2 для того же месяца или месяца + 1или месяц + 2

Я пытался написать запрос в BigQuery, но у меня не получается получить счет за 3 месяца из другой таблицы без жесткого кодирования месяцев

Текущие таблицы выглядяткак показано ниже:

Таблица 1:
отметка времени |ID |


2019-06 |1
2019-06 |2
2019-06 |3
2019-07 |4
2019-07 |5
2019-08 |6
2019-08 |7
2019-09 |8
2019-09 |9
2019-10 |10

Таблица 2:
отметка времени |ID |


2019-06 |1
2019-06 |13
2019-06 |8
2019-07 |2
2019-07 |9
2019-08 |12
2019-08 |4
2019-09 |5
2019-09 |13
2019-10 |11
2019-10 |6
2019-10 |3

Ожидаемый результат:
time_stamp |считать |


2019-06 |2
2019-07 |2
2019-08 |1
2019-09 |0
2019-10 |0

Выход для 2019-06 равен 2, поскольку идентификаторы 1 и 2 в Таблице 1 для 2019-06 представлены в таблице 2 либо в 2019-06, 2019-07, либо в 2019-08. Обратите внимание, что идентификатор 3 из таблицы 1 не будет включен в счет за 2019-06 гг., Как показано в таблице 2 по истечении (2019-06 + 2) месяца

Ответы [ 3 ]

1 голос
/ 29 октября 2019

Я верю, что это достигнет вашей цели, хотя я не смог проверить это без скрипки.

 SELECT timestamp,
       Max(id)
FROM   table1 t1
WHERE  EXISTS (SELECT 1
               FROM   table2 t2
               WHERE  Month(t2.timestamp) IN ( Month(t1.timestamp), Month(
                                               Dateadd(mm, 1, t1.timestamp)
                                                       ), Month(
                                                       Dateadd(mm, 2,
                                                       t1.timestamp)) )
                      AND Year(t1.timestamp) = Year(t2.timestamp)
                      AND t1.ID = t2.ID)
GROUP  BY timestamp  

Редактировать:

Я изначально прочитал это неправильно, и вы искали счет. Та же логика, другой формат.

 SELECT timestamp,
       Sum(CASE
             WHEN EXISTS (SELECT 1
                          FROM   table2 t2
                          WHERE  Month(t2.timestamp) IN (
                                 Month(t1.timestamp), Month(
                                 Dateadd(mm, 1, t1.timestamp)
                                         ), Month(
                                         Dateadd(mm, 2,
                                         t1.timestamp)) )
                                 AND Year(t1.timestamp) = Year(t2.timestamp)
                                 AND t1.ID = t2.ID)
           THEN 1
             ELSE 0
           END) AS "count"
FROM   table1 t1
GROUP  BY id, timestamp  
0 голосов
/ 29 октября 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT time_stamp, COALESCE(`count`, 0) `count` 
FROM (
  SELECT DISTINCT time_stamp FROM `project.dataset.table_1`
) LEFT JOIN (
  SELECT time_stamp, COUNT(id) AS `count`
  FROM (
    SELECT t1.id, t1.time_stamp, ARRAY_AGG(t2.time_stamp) matches
    FROM `project.dataset.table_1` t1
    JOIN `project.dataset.table_2` t2
    ON t1.id = t2.id
    GROUP BY id, time_stamp
  )
  WHERE EXISTS (
    SELECT 1
    FROM UNNEST(matches) match
    WHERE PARSE_DATE('%Y-%m', match) 
      BETWEEN PARSE_DATE('%Y-%m', time_stamp) 
      AND DATE_ADD(PARSE_DATE('%Y-%m', time_stamp), INTERVAL 2 MONTH)
  )
  GROUP BY time_stamp
) USING (time_stamp)  

Вы можете протестировать, поиграть с приведенными выше примерами данных, как есть в вашем вопросе

#standardSQL
WITH `project.dataset.table_1` AS (
  SELECT '2019-06' time_stamp, 1 id UNION ALL
  SELECT '2019-06', 2 UNION ALL
  SELECT '2019-06', 3 UNION ALL
  SELECT '2019-07', 4 UNION ALL
  SELECT '2019-07', 5 UNION ALL
  SELECT '2019-08', 6 UNION ALL
  SELECT '2019-08', 7 UNION ALL
  SELECT '2019-09', 8 UNION ALL
  SELECT '2019-09', 9 UNION ALL
  SELECT '2019-10', 10 
), `project.dataset.table_2` AS (
  SELECT '2019-06' time_stamp, 1 id UNION ALL
  SELECT '2019-06', 13 UNION ALL
  SELECT '2019-06', 8 UNION ALL
  SELECT '2019-07', 2 UNION ALL
  SELECT '2019-07', 9 UNION ALL
  SELECT '2019-08', 12 UNION ALL
  SELECT '2019-08', 4 UNION ALL
  SELECT '2019-09', 5 UNION ALL
  SELECT '2019-09', 13 UNION ALL
  SELECT '2019-10', 11 UNION ALL
  SELECT '2019-10', 6 UNION ALL
  SELECT '2019-10', 3 
)
SELECT time_stamp, COALESCE(`count`, 0) `count` 
FROM (
  SELECT DISTINCT time_stamp FROM `project.dataset.table_1`
) LEFT JOIN (
  SELECT time_stamp, COUNT(id) AS `count`
  FROM (
    SELECT t1.id, t1.time_stamp, ARRAY_AGG(t2.time_stamp) matches
    FROM `project.dataset.table_1` t1
    JOIN `project.dataset.table_2` t2
    ON t1.id = t2.id
    GROUP BY id, time_stamp
  )
  WHERE EXISTS (
    SELECT 1
    FROM UNNEST(matches) match
    WHERE PARSE_DATE('%Y-%m', match) 
      BETWEEN PARSE_DATE('%Y-%m', time_stamp) 
      AND DATE_ADD(PARSE_DATE('%Y-%m', time_stamp), INTERVAL 2 MONTH)
  )
  GROUP BY time_stamp
) USING (time_stamp)

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

Row time_stamp  count    
1   2019-06     2    
2   2019-07     2    
3   2019-08     1    
4   2019-09     0    
5   2019-10     0    
0 голосов
/ 29 октября 2019

Думаю, я просто скопировал бы данные во второй таблице и использовал бы count(distinct):

select timestamp_trunc(t1.time_stamp, month),
       count(distinct t1.id)
from table1 t1 join
     ((select t2.time_stamp, t2.id
       from table2 t2
      ) union all
      (select timestamp_add(t2.time_stamp, interval 1 month), t2.id
       from table2 t2
      ) union all
      (select timestamp_add(t2.time_stamp, interval 2 month), t2.id
       from table2 t2
      )
     ) t2
     on t1.id = t2.id and
        timestamp_trunc(t1.time_stamp, month) = timestamp_trunc(t2.time_stamp, month)
group by timestamp_trunc(t1.time_stamp, month)
order by timestamp_trunc(t1.time_stamp, month)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...