sql >> Database >  >> RDS >> Sqlserver

De huidige waarde en de vorige waarde tussen het datumbereik afdrukken

Iets als het volgende zou moeten werken:

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

Dit levert maximaal twee rijen op. Het is niet duidelijk of u kolommen met datum- en tijdgegevens gebruikt, of dat u gereserveerde woorden als kolomnamen gebruikt, dus daar zult u zich mee bezig moeten houden. (Ik heb Tijd weggelaten, maar dat zou je gemakkelijk kunnen toevoegen aan de verschillende volgordes en filteringen.)

Gezien de herziene criteria wordt het een beetje lastiger, omdat het opnemen of uitsluiten van een rij afhankelijk is van de waarde die in een andere rij wordt geretourneerd. Hier wordt de "tweede" rij, als er twee of meer rijen zijn, alleen opgenomen als de "eerste" rij gelijk is aan een bepaalde waarde. De standaardmanier om dit te doen, is door de gegevens op te vragen om de maximale waarde te krijgen en deze vervolgens opnieuw op te vragen terwijl u verwijst naar het resultaat van de eerste set.

Je kunt echter veel gekke dingen doen met row_number. Werk hieraan:

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

U moet het datum/tijd-probleem oplossen, aangezien dit alleen werkt voor datums.



  1. MySQL Hoe unieke/verschillende resultaten retourneren?

  2. Verwijderen uit een MySQL-tabel met beperkingen voor externe sleutels

  3. SELECT max(x) retourneert null; hoe kan ik ervoor zorgen dat het 0 teruggeeft?

  4. SQL-query op datum wanneer type VARCHAR is