Я хотел бы сгенерировать некоторые выходные данные, используя разные фильтры даты из одного источника. Я мог бы сделать это с помощью 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
Я хотел бы сделать второй вариант, но это много работать, когда у меня есть сотни или тысячи строк данных. Есть ли способ сделать это? Заранее спасибо.