Как создать несколько баз данных из одного источника без использования UNION? - PullRequest
0 голосов
/ 27 апреля 2020

Я хотел бы сгенерировать некоторые выходные данные, используя разные фильтры даты из одного источника. Я мог бы сделать это с помощью UNION, но это занимает много времени. Есть ли способ сделать это без использования UNION?

Исходная таблица будет выглядеть так:

source_keyword_table:

| keyword | start_date | end_date   |
+---------+------------+------------+
| abc     | 2020-01-01 | 2020-01-07 |
+---------+------------+------------+
| cde     | 2020-02-03 | 2020-02-07 |
+---------+------------+------------+
| fgh     | 2020-03-01 | 2020-03-02 |
+---------+------------+------------+

Подробно, я хотел бы сгенерировать эти данные: 1. Эффективность ключевого слова из ab c между 2020-01-01 и 2020-01-07 2. Эффективность ключевого слова с def между 2020-02-03 и 2020-02-07 3. Эффективность ключевого слова от ghi между 2020-03-01 и 2020-03-02

Я мог бы использовать следующий запрос:

SELECT b.date, keyword, COUNT(DISTINCT search_id) total_search
FROM source_keyword_table a
JOIN total_search_table b USING (keyword)
WHERE b.date BETWEEN (SELECT MIN(start_date) FROM source_keyword_table) AND (SELECT MAX(end_date) FROM source_keyword_table)
GROUP BY 1, 2

Этот запрос вернет некоторый вывод с некоторой даты, которая не нужна

Второй вариант будет:

SELECT b.date, keyword, COUNT(DISTINCT search_id) total_search
FROM source_keyword_table a
JOIN total_search_table b USING (keyword)
WHERE b.date BETWEEN (SELECT start_date FROM source_keyword_table WHERE keyword = 'abc') AND (SELECT end_date FROM source_keyword_table WHERE keyword = 'abc')
GROUP BY 1, 2

UNION ALL

SELECT b.date, keyword, COUNT(DISTINCT search_id) total_search
FROM source_keyword_table a
JOIN total_search_table b USING (keyword)
WHERE b.date BETWEEN (SELECT start_date FROM source_keyword_table WHERE keyword = 'def') AND (SELECT end_date FROM source_keyword_table WHERE keyword = 'def')
GROUP BY 1, 2

UNION ALL

SELECT b.date, keyword, COUNT(DISTINCT search_id) total_search
FROM source_keyword_table a
JOIN total_search_table b USING (keyword)
WHERE b.date BETWEEN (SELECT start_date FROM source_keyword_table WHERE keyword = 'ghi') AND (SELECT end_date FROM source_keyword_table WHERE keyword = 'ghi')
GROUP BY 1, 2

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Вы можете использовать подстановочный знак, как на BigQuery.

Существуют некоторые ограничения , которые необходимо учитывать, но, как в вашем примере, похоже, что у вас есть общая совместимая схема, поэтому вы можете просто сделать:

SELECT date, keyword, COUNT(DISTINCT search_id) total_search
FROM common_table_name_*
GROUP BY 1, 2

* определяет подстановочный знак. Вы также можете использовать суффиксы .

Если в ваших таблицах нет common_table_name_, на который вы можете ссылаться, вы можете называть их вверху как CTE или создавать для них представления, хотя это будет лучше, чем я считаю.

0 голосов
/ 27 апреля 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT b.date, a.keyword, COUNT(DISTINCT search_id) AS total_search  
FROM `project.dataset.total_search_table` b
JOIN `project.dataset.source_keyword_table` a
ON b.keyword = a.keyword
AND b.date BETWEEN a.start_date AND a.end_date
GROUP BY 1, 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...