0
votes

Comment sélectionner des dates en fonction de la condition sur une autre ligne en SQL?

J'ai les données suivantes, sur lesquelles je veux imprimer quelques lignes en fonction d'une autre condition sur d'autres colonnes:

La condition est que, si (role = xx ou role = yy) et status = Approved, alors nous devons récupérer le maximum (Start_Date) des deux lignes.

Comment y parvenir?


4 commentaires

Merci de ne pas publier d'images, mais de modifier votre question pour publier les données sous forme de texte formaté + votre tentative + les résultats attendus


Les exemples de données sont mieux servis sous forme de DDL + DML . Veuillez modifier votre question pour l'inclure, votre tentative actuelle et les résultats souhaités.


Quelle est votre sortie d'échantillon attendue?


Et qu'en est-il du reste des rangées?


3 Réponses :


1
votes

Est-ce ce que vous recherchez?

select *
from (
    select 
        t.*,
        case when role in ('xx', 'yy') and status = 'Approved'
            then row_number() over(partition by id order by start_date desc)
            else 1
        end rn
    from mytable t
) t
where rn = 1

L'idée est de classer les enregistrements qui satisfont à un ensemble de conditions particulières, et d'attribuer un classement par défaut à tous les autres enregistrements. Ensuite, ce classement personnalisé peut être utilisé pour le filtrage.


0 commentaires

1
votes

Vous pouvez faire quelque chose comme ceci.

select 
case when (role='xx' or role='yy') and status ='approved'
then max([date])
else [date]
end as 'your column name'

 from [yourtable]  
 group by role,status ,[date]


0 commentaires

1
votes

La condition est que, si (role = xx ou role = yy) et status = Approved, alors nous devons récupérer le maximum (Start_Date) des deux lignes.

Je suppose que cela fait référence à par id et que vous voulez filtrer les autres lignes. Une méthode relativement simple est:

select t.*
from (select t.*,
             row_number() over (partition by id order by start_date desc) as seqnum
      from t
      where t.role in ('xx', 'yy') and
            t.status = 'Approved' 
     ) t
where seqnum = 1;

Vous pouvez également exprimer cela en utilisant row_number():

select t.*
from t
where t.role in ('xx', 'yy') and
      t.status = 'Approved' and
      t.start_date = (select max(t2.start_date)
                      from t t2
                      where t2.id = t.id and
                            t2.role in ('xx', 'yy') and
                            t2.status = 'Approved'
                     );

Les deux peuvent être facilement modifiés pour choisir les autres lignes, mais ce n'est pas ainsi que j'interprète la question.


0 commentaires