У меня есть таблица, которая выглядит следующим образом:
control=# select * from animals;
age_range | weight | species
-----------+--------+---------
0-9 | 1 | lion
0-9 | 2 | lion
10-19 | 2 | tiger
10-19 | 3 | horse
20-29 | 2 | tiger
20-29 | 2 | zebra
Я выполняю запрос, который суммирует вес животных в пределах возрастных групп, и я хочу только вернуть строки, которые имеют агрегированные веса выше определенного числа.
Сводный запрос:
SELECT
age_range,
SUM(animals.weight) AS weight,
COUNT(DISTINCT animals.species) AS distinct_species
FROM animals
GROUP BY age_range
HAVING SUM(animals.weight) > 3;
Сводные результаты:
age_range | weight | distinct_species
-----------+--------+------------------
10-19 | 5 | 2
20-29 | 4 | 2
Теперь вот загвоздка.Наряду с этим кратким изложением, я хочу сообщить о различном количестве видов, использованных для создания вышеуказанного итогового набора строк в целом.Для простоты, будем называть это число «Итоговое количество видов».В этом простом примере, так как только 3 вида (тигр, зебра, лошадь) были использованы для получения 2 строк этого резюме, а не «лев», «Общее количество отдельных видов» должно быть 3. Но я не могу понять,как успешно запросить этот номер.Поскольку в итоговом запросе должно использоваться предложение has, чтобы применить фильтр к уже сгруппированному и агрегированному набору строк, это создает проблемы при попытке запросить «Общее количество видов».
Это возвращает неправильное число, 2, потому что это неправильно отличный счет отдельного счета:
SELECT
COUNT(DISTINCT distinct_species) AS distinct_species_total
FROM (
SELECT
age_range,
SUM(animals.weight) AS weight,
COUNT(DISTINCT animals.species) AS distinct_species
FROM animals
GROUP BY age_range
HAVING SUM(animals.weight) > 3
) x;
И, конечно, это возвращает неправильное число, 4, потому что он не учитывает фильтрацию сгруппированных и агрегированных итоговых результатов с использованием наличияпредложение:
SELECT
COUNT(DISTINCT species) AS distinct_species_total
FROM animals;
Любая помощь в том, чтобы привести меня на правильный путь, здесь ценится и, надеюсь, поможет другим с подобной проблемой, но в конце концов мне нужно решение, которое будет работать сAmazon Redshift.