Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Impression de la valeur actuelle et de la valeur précédente entre la plage de dates

Quelque chose comme ce qui suit devrait fonctionner :

SELECT ID, Date, Time, Status
 from (select ID, Date, Time, Status, row_number() over (order by Date) Ranking
        from MyTable
        where ID = @SearchId
         and Date <= @SearchDate) xx
 where Ranking < 3
 order by Date, Time

Cela renverra au plus deux lignes. Ce n'est pas clair si vous utilisez des colonnes de type date et heure, ou si vous utilisez réellement des mots réservés comme noms de colonne, vous devrez donc vous en occuper. (J'ai omis le temps, mais vous pouvez facilement l'ajouter aux divers classements et filtrages.)

Compte tenu des critères révisés, cela devient un peu plus délicat, car l'inclusion ou l'exclusion d'une ligne dépend de la valeur renvoyée dans une ligne différente. Ici, la "deuxième" ligne, s'il y a deux lignes ou plus, n'est incluse que si la "première" ligne est égale à une valeur particulière. La méthode standard consiste à interroger les données pour obtenir la valeur maximale, puis à les interroger à nouveau tout en faisant référence au résultat du premier ensemble.

Cependant, vous pouvez faire beaucoup de choses compliquées avec row_number. Travaillez sur ceci :

SELECT ID, Date, Time, Status
 from (select
          ID, Date, Time, Status
         ,row_number() over (partition by case when Date = @SearchDate then 0 else 1 end
                             order by     case when Date = @SearchDate then 0 else 1 end
                                         ,Date) Ranking
        from MyTable
        where ID = @SearchId
         and Date <= @SearchDate) xx
 where Ranking = 1
 order by Date, Time

Vous devrez résoudre le problème de date/heure, car cela ne fonctionne qu'avec les dates.