Запросы для отдельного счетчика, используемого для создания сгруппированного, агрегированного и отфильтрованного набора строк - PullRequest
0 голосов
/ 07 июня 2018

У меня есть таблица, которая выглядит следующим образом:

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.

1 Ответ

0 голосов
/ 07 июня 2018

Соедините набор результатов с исходной таблицей животных и сосчитайте различные виды.

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
...