Запросы для отдельного счетчика, используемого для создания сгруппированного, агрегированного и отфильтрованного набора строк
У меня есть таблица, которая выглядит так:
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, потому что оно не учитывает фильтрацию сгруппированных и агрегированных итоговых результатов с использованием предложения has:
SELECT
COUNT(DISTINCT species) AS distinct_species_total
FROM animals;
Любая помощь в приведении меня на правильный путь здесь ценится и, надеюсь, поможет другим с подобной проблемой, но в конце концов мне нужно решение, которое будет работать с Amazon Redshift.
1 ответ
Объедините набор результатов с исходной таблицей животных и сосчитайте различные виды.
select distinct x.age_range,x.weight,count(distinct y.species) as distinct_species_total
from
(
select age_range,sum(animals.weight) as weight
from animals
group by age_range
having sum(animals.weight) > 3
) x
join animals y on x.age_range=y.age_range