количество значений column_1 для каждого отдельного значения в column_2 на основе заданного условия с использованием BigQuery - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть таблица типа,

date_1 | date_2
2018-12-08 | 2018-12-07
2018-12-09 | 2018-12-07
2018-12-13 | 2018-12-07
2018-12-16 | 2018-12-07
2018-12-14 | 2018-12-09

Таблица вывода должна выглядеть следующим образом:

date_2 | count_of_date_1_after_date_2
2018-12-07 | 5
2018-12-09 | 3

Я хочу количество date_1 'после' date_2.

Я пытался и придумал этот ответ, но я не уверен, что это лучший способ сделать это.Есть ли лучший способ сделать это?

WITH

sample_table AS (
  SELECT DATE('2018-12-08') AS date_1, DATE('2018-12-07') AS date_2, 'AAA' as uid UNION ALL
  SELECT DATE('2018-12-09') AS date_1, DATE('2018-12-07') AS date_2, 'AAA' as uid  UNION ALL
  SELECT DATE('2018-12-13') AS date_1, DATE('2018-12-07') AS date_2, 'AAA' as uid  UNION ALL
  SELECT DATE('2018-12-16') AS date_1, DATE('2018-12-07') AS date_2, 'AAA' as uid  UNION ALL
  SELECT DATE('2018-12-14') AS date_1, DATE('2018-12-09') AS date_2, 'AAA' as uid 
),

distinct_date_2 AS (
  SELECT DISTINCT(date_2) AS distinct_date, uid FROM sample_table
)


SELECT distinct_date, COUNTIF(date_1 > distinct_date)
FROM sample_table
LEFT JOIN distinct_date_2
USING (uid)
GROUP BY distinct_date
ORDER BY distinct_date

1 Ответ

0 голосов
/ 20 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT date_2,
  (SELECT COUNT(1) FROM t.arr date_1 WHERE date_1 > date_2) AS count_of_date_1_after_date_2
FROM (
  SELECT date_2, ANY_VALUE(arr) arr
  FROM (
    SELECT date_2, ARRAY_AGG(date_1) OVER() arr
    FROM `project.dataset.table`
  ) 
  GROUP BY date_2
) t

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2018-12-08' date_1, DATE '2018-12-07' date_2 UNION ALL
  SELECT '2018-12-09', '2018-12-07' UNION ALL
  SELECT '2018-12-13', '2018-12-07' UNION ALL
  SELECT '2018-12-16', '2018-12-07' UNION ALL
  SELECT '2018-12-14', '2018-12-09' 
)
SELECT date_2,
  (SELECT COUNT(1) FROM t.arr date_1 WHERE date_1 > date_2) AS count_of_date_1_after_date_2
FROM (
  SELECT date_2, ANY_VALUE(arr) arr
  FROM (
    SELECT date_2, ARRAY_AGG(date_1) OVER() arr
    FROM `project.dataset.table`
  ) 
  GROUP BY date_2
) t

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

Row     date_2          count_of_date_1_after_date_2     
1       2018-12-07      5    
2       2018-12-09      3    
...