Count distinct over window

La norme SQL évolue : tirez le meilleur d'un SGBD qui la respecte en écrivant du SQL moderne avec en complément PL/pgSQL, php, java etc.
Répondre
Phil
Administrateur du site
Messages : 240
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

Count distinct over window

Message par Phil » 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.
Cdlt. Phil - pgphil.ovh

Répondre