2017-10-11 9 views
0

Ma méthode actuelle de dé-duper est vraiment bête.Comment puis-je sélectionner seulement 1 enregistrement par identifiant utilisateur en utilisant ROW_NUMBER sans sous-requête?

select col1, col2 ... col500 from 
(select col1, col2 ... col500, ROW_NUMBER() OVER(PARTITION BY uid) as row_num) 
where row_num=1; 

Existe-t-il un moyen de le faire sans sous-requête? Select distinct n'est pas une option car il peut y avoir de petites variations dans les colonnes qui ne sont pas significatives pour cette sortie.

+1

Quel est le problème avec la sous-requête? Cela ressemble à une requête parfaite pour moi. –

+1

Les fonctions de fenêtre sont restituées après la requête, dans votre exemple, d'abord elle exécute le 'SELECT col1, col2 ... FROM ...' puis elle exécute la fonction de la fenêtre row_number ** OVER ** les résultats de la requête. C'est pourquoi vous utilisez une sous-requête pour obtenir des doublons. Ce n'est pas bête, c'est ce que c'est, et c'est l'une des meilleures façons de résoudre ce genre de requête. Sinon, vous devrez écrire un PL pour cela. – Dan

+0

Oh bien. J'ai tellement de colonnes que les répéter deux fois est maladroit. Merci pour vos commentaires Juan, Dan – ForeverConfused

Répondre

1

Dans Postgres distinct on() est généralement plus rapide que la solution équivalente en utilisant une fonction de fenêtre et ne nécessite pas une sous-requête:

select distinct on (uuid) * 
from the_table 
order by something 

Vous ont pour fournir une commande par (ce qui est quelque chose que vous aurait dû aussi faire row_number()) pour obtenir des résultats stables - sinon la ligne choisie est "aléatoire".


Ce qui précède est vrai pour Postgres. Vous avez également tagué votre question avec amazon-redshift - Je ne sais pas si Redshift (qui est en fait un SGBD très différent) supporte la même chose et si elle est aussi efficace.

+0

J'utilise à la fois redshift et postgres si bon à savoir. – ForeverConfused