SELEZIONA le occorrenze di una combinazione di colonne con una condizione minima su COUNT

Aug 23 2020

Sto memorizzando alcuni dati ogni giorno in una tabella OptionsData. In questa tabella sono interessato a due colonne "asofdate" e "contract". La combinazione di asofdate + contratto dovrebbe essere unica: in caso contrario, devo fare un po 'di pulizia. Vorrei restituire 3 colonne come segue: asofdate !! contratto !! conteggio> 1

Questo mi permetterà di identificare i duplicati nella mia tabella. Ho provato quanto segue:

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

Ma questo restituisce un errore:

ERROR:  column "mycount" does not exist

La stessa cosa accade se specifichi

HAVING DerivedTable.mycount > 1

(Ho anche provato un'istruzione WHERE invece di HAVING ma questo dà un altro errore:

ERROR:  syntax error at or near "WHERE"

)

Inutile dire che sono un principiante in sql ...

Risposte

3 ThorstenKettner Aug 23 2020 at 13:48

Non è possibile utilizzare un nome alias nella GROUP BYclausola. Inoltre: perché la sottoquery? Riduce le righe a una per data e contratto, quindi se conti in seguito ottieni un conteggio di 1 per ogni coppia data / contratto.

select asofdate, contract, count(*) as mycount 
from public.optionsdata
group by asofdate, contract
having count(*) > 1
order by mycount desc;