私の主な質問は次の投稿で解決されました
各行間の読み取り値を合計するという問題が 1 つあります。
id device_id time reading shift_id
150323 3 2013-02-25 15:22:01.273 999948.00 43
150324 1 2013-02-25 15:22:01.423 999962.00 43
150325 3 2013-02-25 15:22:01.463 999966.00 43
150326 1 2013-02-25 15:22:01.610 999979.00 43
150327 3 2013-02-25 15:22:01.650 999983.00 43
150328 1 2013-02-25 15:22:01.810 999997.00 43
上記のシナリオでは結果が得られますが、次の場合は、提供されたソリューションに従って測定値が正しくなりますが、差を増やしたい...
id device_id time reading shift_id
150322 1 2013-02-25 15:22:01.233 999945.00 43
150323 3 2013-02-25 15:22:01.273 999948.00 43
150324 1 2013-02-25 15:22:01.423 999962.00 43
150325 3 2013-02-25 15:22:01.463 999966.00 43
150326 1 2013-02-25 15:22:01.610 999979.00 43
150327 3 2013-02-25 15:22:01.650 999983.00 43
150328 1 2013-02-25 15:22:01.810 999997.00 43
150329 3 2013-02-25 15:22:01.853 1.00 43
150330 1 2013-02-25 15:22:02.000 15.00 43
150331 3 2013-02-25 15:22:02.040 18.00 43
150332 1 2013-02-25 15:22:02.187 32.00 43
上記の読み取り結果は次のとおりです。
Day Shifts Hour Device ID Count1
2013-02-25 2nd 11 1 39145.00
2013-02-25 2nd 11 3 39148.00
2013-02-25 2nd 12 1 248022.00
2013-02-25 2nd 12 3 248022.00
2013-02-25 2nd 13 1 389195.00
2013-02-25 2nd 13 3 389197.00
2013-02-25 2nd 14 1 201855.00
2013-02-25 2nd 14 3 201854.00
2013-02-25 2nd 15 1 -877108.00
2013-02-25 2nd 15 3 -877112.00
負のこれら 2 つの値は正である必要があり、値は 122892 - 122889 のようなものである必要があります。
注 : 読み取りの最大値は常に 999999.00 であり、その後は 0 から 999999.00 まで、再び 0 から開始します。これは基本的にカウントするカウント デバイスです。以下は、スタックオーバーフローで提案されたクエリであり、必要に応じて少し変更しました
declare @fromdate datetime;
declare @todate datetime;
declare @total as decimal(18,2);
SET @fromdate = '2/23/2013 10:51:17 AM';
SET @todate ='2/25/2013 12:10:56 PM';
WITH cte AS
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY device_id ORDER BY [time]) AS NId
FROM [dbo].[readings] r
where cast(r.time as date)>= CAST(@fromdate as date) and
cast(r.time as date) <= CAST(@todate as date) and
r.device_id<>5
)
SELECT CAST (c1.[time] as DATE) as [Day],
(
select s.name from shifts s where s.id = c1.shift_id
) as Shifts,
DATEPART(hour,c1.time) as [Hour],
c1.device_id as [Device ID],
(select
case when sum(c2.reading - ISNULL(c1.reading, c2.reading)) < 0 then
sum(c1.reading - ISNULL(c2.reading, c1.reading))
else
sum(c2.reading - ISNULL(c1.reading, c2.reading))
end
) AS Count1
FROM cte c1 left JOIN cte c2 ON c1.device_id = c2.device_id AND
c1.NId + 1 = c2.NId
group by cast(c1.time as DATE), c1.shift_id , DATEPART(hour,c1.time), c1.device_id
order by cast(c1.time as DATE), c1.shift_id,DATEPART(hour,c1.time), c1.device_id