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?
3 Réponses :
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,
OP veut aussi la valeur du résultat.
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
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
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