ВЫБЕРИТЕ вхождения комбинации столбцов с минимальным условием для ПОДСЧЕТА

#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;