1
votes

Sélectionnez un ID unique tout en préférant la valeur de la colonne

J'ai une base de données qui ressemble à ceci:

ID Date  Result
1   12  good
2   10  bad

Je veux obtenir une liste d'identifiants uniques qui prennent la date la plus ancienne où le résultat était bon et si ce résultat n'existe pas, alors il prend la date la plus ancienne pour ledit identifiant

Le résultat ici serait:

ID Date  Result
1   12  good
1   11  bad
2   11  bad
2   10  bad

Je suis fatigué d'utiliser Union mais je continue à recevoir des identifiants en double

Des idées?

sql

2 commentaires

Quel SGBD utilisez-vous? "SQL" est simplement un langage de requête, pas le nom d'un produit de base de données spécifique. Veuillez ajouter une balise pour le produit de base de données que vous utilisez. Pourquoi devrais-je baliser mon SGBD


utiliser l'auto-jointure sur votre table


3 Réponses :


1
votes

Vous pouvez utiliser coalesce () et group by :

select id,
       coalesce(min(case when result = 'good' then 'good end),
                min(date)
               )
       coalesce(min(case when result = 'good' then 'good' end),
                'bad'
               )
from t
group by id;

EDIT:

Pour la valeur , vous pouvez utiliser la même logique:

select id,
       coalesce(min(case when result = 'good' then date end),
                min(date)
               )
from t
group by id;

Cela suppose que les valeurs sont «bonnes» ou «mauvaises». Sinon, vous devez obtenir la première valeur de la colonne. La meilleure façon de procéder dépend de la base de données, qui n'est pas balisée,


1 commentaires

OP veut aussi la valeur du résultat.



0
votes

Avoir une sous-requête qui renvoie chaque identifiant avec son meilleur résultat (bon si disponible). REJOIGNEZ avec ce résultat:

select t1.ID, t1.max(Date), t1.Result
from tablename t1
join (select id, max(result) result
      from tablename
      group by id) t2 on t1.ID = t2.ID and t1.Result = t2.Result
group by t1.ID, t1.Result


0 commentaires

0
votes

En supposant que le nom de la table est temp.

with cte as (select *, row_number()over(partition by id order by result desc, date) date_rn from temp)
    select id, date, result 
    from cte c1 
    where date_rn = 1


0 commentaires