0

データベースから多数の行を返すために現在使用している SQL ステートメントがあります。

SELECT
    as1.AssetTagID, as1.TagID, as1.CategoryID,
    as1.Description, as1.HomeLocationID, as1.ParentAssetTagID
FROM Assets AS as1
    INNER JOIN AssetsReads AS ar  ON as1.AssetTagID = ar.AssetTagID
WHERE
    (ar.ReadPointLocationID='Readpoint1' OR ar.ReadPointLocationID='Readpoint2')
    AND (ar.DateScanned between 'LastScan' AND 'Now')
    AND as1.TagID!='000000000000000000000000'

DateScannedこのクエリから最も古い行を取得し、この行から一定期間内にある行があった場合はデータベースから別の行を取得するクエリを実行したいと考えています(例として 5 秒)。最も古いレコードは、降順で最初のレコードを選択することで比較的単純になりますが、最初のレコードから特定の期間内にある場合、2 番目のレコードも取得するにはどうすればよいでしょうか?

このプロセスを複数のクエリで実行できることはわかっていますが、このプロセスを 1 つのクエリに結合する方法はありますか?

私が使用しているデータベースは SQL Server 2008 R2 です。

また、DateScanned時間は単なるプレースホルダーであり、このクエリを使用するアプリケーションで処理していることに注意してください。

4

2 に答える 2

1

これは、それにアプローチするためのかなり一般的な方法です。ウィンドウ関数として使用して最も古いスキャン日付を取得し、min()日付演算を使用して必要な行を取得します。

select t.*  -- or whatever fields you want
from (SELECT as1.AssetTagID, as1.TagID, as1.CategoryID,
             as1.Description, as1.HomeLocationID, as1.ParentAssetTagID,
             min(DateScanned) over () as minDateScanned, DateScanned
      FROM Assets AS as1
           INNER JOIN AssetsReads AS ar  ON as1.AssetTagID = ar.AssetTagID
      WHERE (ar.ReadPointLocationID='Readpoint1' OR ar.ReadPointLocationID='Readpoint2')
            AND (ar.DateScanned between 'LastScan' AND 'Now')
            AND as1.TagID!='000000000000000000000000'
     ) t
where datediff(second, minDateScanned, DateScanned) <= 5;
于 2013-08-09T20:21:04.983 に答える