2017-06-11 4 views
1

J'ai quelques exemples de données dans ma base de données PostgreSQL 9.5 comme suit:Comment puis-je trouver conditionnellement mode dans PostgreSQL

Group  length 
A   19.3 
A   19.3 
A   20.3 
A   20.3 
A   19.3 
A   19.3 
B   22.1 
B   19.3 
B   
B   15.5 
B   12.8 
B   14.7 

Pour chaque groupe, je voudrais trouver conditionnellement le mode (la valeur la plus répétitive/commune) en utilisant la fonction PostgreSQL mode() telle sorte que:

  • Si est nul dans les longueurs, le remplacer par 0,0
  • mode Rechercher pour chaque/groupe unique
  • S'il y a deux modes, retour la plus grande valeur
  • Si le mode n'existe pas revenir alors 0,0 pour ce groupe

La sortie souhaitée pourrait être comme:

Group length 
A  19.3 
B  0.0 

Comment puis-je sous conditions trouver le mode, quelqu'un peut-il m'aider?

Répondre

2

Je pense que vos conditions tout se résument à:

select group, 
     mode() within group (order by coalesce(length, 0.0) desc) 
from t 
group by group 

Si vous avez une ligne pour group, alors mode() ne peut pas revenir NULL, donc un autre COALESCE() externe n'est pas nécessaire.

+0

Merci beaucoup mais il a retourné 22.1 pour le groupe B où il n'y a pas de valeur répétée (pas de mode) et il devrait retourner zéro selon ma condition. –

+0

Pourquoi faites-vous le tri par DESC? J'ai ajouté cette ligne, mode() dans le groupe (ordre par coalesce (longueur, 0)) et cela a fonctionné. –