#sql #postgresql #count #postgresql-9.4 #having-clause
#sql #postgresql #количество #postgresql-9.4 #наличие-предложение
Вопрос:
У меня есть таблица примерно такого типа
плодовое состояние
——————-
яблоко — новое
яблоко — хорошо
яблоко — хорошо
яблоко — плохой
банан — новый
банан — хорошо
банан — плохой
апельсин — новый
апельсин — хорошо апельсин — хорошо
апельсин — хорошо
апельсин — хорошо
апельсин — хорошо
апельсин -хорошо
Я хочу получить элементы, которые не находятся в «плохом» состоянии, и сколько раз это было «хорошо».Что-то вроде этого:
fruit — okaycount
———————-
апельсин — 5
На данный момент Apple и banana находятся в «плохом» состоянии. и апельсины в порядке пять раз (не считая нового состояния).
Я попробовал это, и оно не работает, поскольку оно также выдает состояние apple и banana ‘okay’.
select * from (select fruit, count(fruit) AS okaycount
from fruits
where state='okay'
group by fruit) as din
order by din.okaycount desc
limit 10;
Попробовал и это. Не сработало.
SELECT distinct ndt.fruit, COUNT( ndt.fruit ) as okaycount
FROM(select * from fruits where fruit in (select distinct correlationid
from fruits
where wcsstatus!='bad')) as ndt
GROUP BY ndt.fruit
HAVING count(*) > 3;
Комментарии:
1. Что вы имеете в виду «на данный момент»? Таблицы SQL представляют собой неупорядоченные наборы.
2. я имел в виду, что яблоки и бананы не нужно выбирать. но запрос, который я использовал, также собирал яблоки и бананы.
Ответ №1:
В Postgres я бы сформулировал это с помощью счетчика фильтрации и логической агрегации в having
предложении:
select fruit, count(*) filter(where status = 'okay') cnt
from fruits
group by fruit
having not bool_or(status = 'bad')
Ответ №2:
На основе желаемых результатов вы можете использовать:
select fruit, sum( (status = 'okay')::int )
from fruit
group by fruit
having sum( (status = 'bad')::int ) = 0;