SQL — объединить 2 отфильтрованных и сгруппированных временных ряда

#sql #presto

#sql #presto

Вопрос:

У меня есть 2 SQL-запроса, которые я пытаюсь выполнить с помощью Presto / AWS Athena, и они выглядят примерно так:

 SELECT count(distinct id) as filtered_id,
    date_format(from_iso8601_timestamp(mydate), '%Y-%c') AS month_year
FROM table
WHERE value = 'bla'
GROUP BY  date_format(from_iso8601_timestamp(mydate), '%Y-%c')
ORDER BY  date_parse(month_year, '%Y-%c')
  
 SELECT count(distinct id) as unfiltered_id,
    date_format(from_iso8601_timestamp(mydate), '%Y-%c') AS month_year
FROM table
GROUP BY  date_format(from_iso8601_timestamp(mydate), '%Y-%c')
ORDER BY  date_parse(month_year, '%Y-%c')
  

Я бы хотел объединить эти результаты в одну таблицу, в основном временной ряд с 2 значениями для соответствующих дат. Я бы хотел, чтобы filtered_id и unfiltered_id оставались отдельными столбцами. Я не уверен, как этого добиться, я пытался объединить в одной таблице, но я не могу понять, как фильтровать только для 1 серии.

В принципе, я хочу что-то вроде этого в результате:

 filtered_ids, unfiltered_ids, month_year
6, 15, 2020-06
10, 10, 2020-07
10, 20, 2020-08
  

Ответ №1:

Если я правильно понимаю, вы хотите условную агрегацию:

 SELECT count(distinct case when value = 'bla' then id end) as filtered_id,
       count(distinct id) as filtered_id,
       date_format(from_iso8601_timestamp(mydate), '%Y-%c') AS month_year
FROM table
GROUP BY  date_format(from_iso8601_timestamp(mydate), '%Y-%c')
ORDER BY  date_parse(month_year, '%Y-%c');
  

Комментарии:

1. О, это сделало свое дело. У вас есть хорошая ссылка для условной агрегации? Я далек от эксперта по SQL, но сталкиваюсь с этим впервые.