0

データが常に追加されているこの DB テーブルがあります。追加されるデータはセンサー データであるため、センサーごとに 1 時間に 2 回の読み取りがあります。1 か月の最後の読み値のみを取得する方法を知りたいです。例えば、

select * from dbo.NewLogTable
where Sensor_ID= '12345'and Date_Reading between '2012-08-01' and '2012-08-31' 
and DateTimeStamp between '23:30:00'and '23:59:00'
order by DateTimeStamp asc

これが機能しないことはわかっていますが、それは私が望むものの疑似コードです。繰り返しになりますが、ここでの目標は、特定のセンサーについて 1 日に 1 回だけ (最新の) 読み取り値を取得することです。月の最初と最後の日が表示されたり、過去の x 日数が表示されたりする例をたくさん見てきました。私のアプリケーションとはあまり似ていません。誰でも助けることができますか?ありがとう。

4

5 に答える 5

2
WITH
  sequenced AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY sensor_id, Date_Reading ORDER BY DateTimeStamp DESC) AS daily_sequence_id,
    *
  FROM
    dbo.NewLogTable
)
SELECT
  *
FROM
  sequenced
WHERE
  sensor_id = '12345'
  AND Date_Reading BETWEEN '2012-08-01' AND '2012-08-31'
  AND daily_sequence_id = 1
于 2012-10-22T14:27:07.177 に答える
1

row_number()これを実現するためにウィンドウ関数を使用できます

select * from
(
    select 
        *, 
        row_number() over (partition by date_reading order by datetimestamp desc) rn 
    from yourtable
) v
where rn = 1
于 2012-10-22T14:26:33.190 に答える
1

このDATEPART関数を と組み合わせて使用MAX​​すると、1 か月全体の 1 日の読み値を取得できます。

SELECT DATEPART(d, Date_Reading) AS day, MAX(value) AS value FROM table
WHERE Sensor_ID = '12345' 
    AND Date_Reading BETWEEN '2012-08-01' AND '2012-08-31 23:59:59'
GROUP BY DATEPART(d, Date_Reading)

の終了値にBETWEEN時間の部分があることを確認してください。

于 2012-10-22T14:27:59.250 に答える
1

つまり、これを処理するために集計を使用できますMAX()。MSDN は次のとおりです。

http://msdn.microsoft.com/en-us/library/ms187751.aspx

式の最大値を返します。OVER 句が続く場合があります。

クエリの結果は次のようになります。

SELECT SensorID, MAX(Date_reading) FROM NewLogTable GROUP BY Sensor_ID
于 2012-10-22T14:25:24.573 に答える
0
SELECT TOP  1 * 
FROM dbo.NewLogTable
WHERE Sensor_ID = '12345'
AND Date_Reading <= '2012-08-01'
ORDER BY DateTimeSTap DESC 
于 2012-10-22T14:29:15.637 に答える