Count distinct over window
Posté : mar. 19 mars 2019 15:53
Merci à Guillaume pour sa question :
Je rencontre un pb sur l’écriture d’une requête sous PostgreSQL.
Je suis amené à faire ce type de requête :
SELECT DISTINCT JOIN1.CODE DETAIL0,
COUNT(DISTINCT JOIN0.CODE) over (partition BY JOIN1.CODE) UF,
COUNT(DISTINCT JOIN0.CODE) over () UF_TOTAL
FROM QRY_CHARGE_UF REF
INNER JOIN REQ_UF JOIN0 ON JOIN0.ID = REF.IDUF
LEFT JOIN REQ_POLE JOIN1 ON JOIN1.ID = JOIN0.IDPOLE
Or, le « count distinct » ne fonctionne pas sous PostgreSQL avec les fonctions fenêtrées.
Savez-vous si ca sera prochainement corrigé ?
Car j’ai vu sur internet des contournements possibles mais ca oblige à passer par des sous-requêtes. Dans l’exemple, ci-dessus, ca ne sera pas très gênant car je n’en ai que 2 mais je pourrais en avoir bien plus.
Du coup, je crains pour les temps de réponse si je dois rajouter 4,5,6,… sous requêtes.
Réponse :
La situation est similaire avec SQL Server 2017 : : https://www.itprotoday.com/sql-server/w ... lculations . La fonctionnalité ne doit donc pas être standard (à confirmer).
Heureusement, des contournements existent. Il est par exemple possible de travailler avec des max et une seule sous-requête effectuant des dense_rank over (...)
Exemple ici : https://stackoverflow.com/questions/477 ... -partition
La question était posée sur Amazon Redshift mais ce produit est au départ basé sur PostgreSQL et le contournement suggéré fonctionne de la même façon.
Je rencontre un pb sur l’écriture d’une requête sous PostgreSQL.
Je suis amené à faire ce type de requête :
SELECT DISTINCT JOIN1.CODE DETAIL0,
COUNT(DISTINCT JOIN0.CODE) over (partition BY JOIN1.CODE) UF,
COUNT(DISTINCT JOIN0.CODE) over () UF_TOTAL
FROM QRY_CHARGE_UF REF
INNER JOIN REQ_UF JOIN0 ON JOIN0.ID = REF.IDUF
LEFT JOIN REQ_POLE JOIN1 ON JOIN1.ID = JOIN0.IDPOLE
Or, le « count distinct » ne fonctionne pas sous PostgreSQL avec les fonctions fenêtrées.
Savez-vous si ca sera prochainement corrigé ?
Car j’ai vu sur internet des contournements possibles mais ca oblige à passer par des sous-requêtes. Dans l’exemple, ci-dessus, ca ne sera pas très gênant car je n’en ai que 2 mais je pourrais en avoir bien plus.
Du coup, je crains pour les temps de réponse si je dois rajouter 4,5,6,… sous requêtes.
Réponse :
La situation est similaire avec SQL Server 2017 : : https://www.itprotoday.com/sql-server/w ... lculations . La fonctionnalité ne doit donc pas être standard (à confirmer).
Heureusement, des contournements existent. Il est par exemple possible de travailler avec des max et une seule sous-requête effectuant des dense_rank over (...)
Exemple ici : https://stackoverflow.com/questions/477 ... -partition
La question était posée sur Amazon Redshift mais ce produit est au départ basé sur PostgreSQL et le contournement suggéré fonctionne de la même façon.