sql >> データベース >  >> RDS >> Sqlserver

日付範囲間の現在の値と以前の値を印刷する

    次のようなものが動作するはずです:

    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
    

    これにより、最大 2 行が返されます。日付と時刻のデータ型の列を使用しているかどうか、または実際に列名として予約語を使用しているかどうかは明確ではないため、それについては大騒ぎする必要があります。 (時間は省略しましたが、さまざまな順序付けとフィルタリングに簡単に追加できます。)

    行を含めるか除外するかは別の行で返される値に依存するため、修正された基準を考えると、少し複雑になります。ここで、「2 行目」の行は、2 行以上ある場合、「1 行目」の行が特定の値に等しい場合にのみ含まれます。これを行う標準的な方法は、データを照会して最大値を取得し、最初のセットの結果を参照しながら再度照会することです。

    ただし、row_number を使用すると、多くの厄介なことを行うことができます。これに取り組みます:

    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
    

    これは日付に対してのみ機能するため、日付/時刻の問題を解決する必要があります。



    1. uWSGI、Flask、sqlalchemy、およびpostgres:SSLエラー:復号化に失敗したか、レコードマックが不良

    2. ダイナミックピボットMySQL

    3. PostgreSQLにアクセスするためにParamikoでSSHトンネルを設定する

    4. MySQL RAND()関数–MySQLでランダムな数値を生成します