#sql #postgresql #count #having-clause
#sql #postgresql #подсчитайте #having-предложение
Вопрос:
Я каждый день сохраняю некоторые данные в таблице OptionsData. В этой таблице меня интересуют два столбца «asofdate» и «contract». Комбинация asofdate contract должна быть уникальной: если нет, то мне нужно выполнить некоторую очистку. Я хотел бы вернуть 3 столбца следующим образом: asofdate!! контракт!! количество > 1
Это позволит мне идентифицировать дубликаты в моей таблице. Я попробовал следующее:
select asofdate, contract, count(*) mycount
from (select asofdate, contract
from public."OptionsData"
group by asofdate, contract
) AS DerivedTable
GROUP BY asofdate, contract
HAVING mycount > 1
ORDER BY mycount DESC
Но это возвращает ошибку:
ERROR: column "mycount" does not exist
То же самое произойдет, если я укажу
HAVING DerivedTable.mycount > 1
(Я также попробовал оператор WHERE вместо HAVING, но это выдает другую ошибку:
ERROR: syntax error at or near "WHERE"
)
Излишне говорить, что я новичок в sql…
Комментарии:
1. Это сработало бы, если бы вы переместились
count(*) mycount
внутрь подзапроса. Тогда в основном запросе было бы достаточно ИWHERE
вместоGROUP BY
иHAVING
. Но, как вы можете видеть из моего ответа, вам вообще не нужен подзапрос (производная таблица).
Ответ №1:
Вы не можете использовать псевдоним в GROUP BY
предложении. Кроме того: зачем подзапрос? Это уменьшает количество строк до одной для каждого asofdate и контракта, поэтому, если вы будете считать впоследствии, вы получите количество, равное 1 для каждой пары asofdate / contract.
select asofdate, contract, count(*) as mycount
from public.optionsdata
group by asofdate, contract
having count(*) > 1
order by mycount desc;