2013-10-24 13 views
5

bảng của tôi chỉ ra một máy bơm ON tình trạng/OFF như sauXác định đúng thời hạn giữa 1-0 chuyển

Value timestamp 
1  2013-09-01 00:05:41.987 
0  2013-09-01 00:05:48.987 
1  2013-09-01 00:05:59.987 
0  2013-09-01 00:06:15.987 
1  2013-09-01 00:06:34.987 
etc etc. 

Tôi cần một truy vấn MSSQL rằng có thể mất một tháng giá trị của những điều này và cho tôi biết số phút ON (1) và số chỉ trong vài phút OFF (0) nhiệm vụ tức là chu kỳ

+2

gì về thiết bị đầu cuối? Bạn có muốn hàng cuối cùng đại diện cho 1 từ '2013-09-01 00: 06: 34.987' đến hiện tại không? –

Trả lời

0

cho SQL Server 2005 và sau đó @start và @end khai báo s phạm vi thời gian bạn cần phải kiểm tra

with data as 
(
    select 
     value, 
     timestamp, 
     row_number() over (timestamp) as aa 
    from 
     data 
    where 
     timestamp between @start and @end 
) 
select 
    onPayload, 
    datediff(s,@start,@end)-onPayload as offPayload 
from 
( 
select 
    sum(datediff(s,s.timestamp, e.timestamp)) as onPayload, 
from 
    data as s 
inner join 
    data as e 
on 
    s.aa = e.aa-1 
where 
    s.value=1 
and 
    e.value=0 
) as a 
0

Hãy thử điều này (SQL Server 2012):

SELECT value, SUM(sec) AS sec 
FROM 
(
     SELECT value, ISNULL(DATEDIFF(SECOND, timestamp, 
       LEAD(timestamp,1) OVER (ORDER BY timestamp) 
       ),0) sec 
     FROM tbl 
) t 
GROUP BY value; 
1

Sử dụng CTERowNumber() functionFiddle demo:

declare @date date = '20130925' 

;with cte as (
    select value, timestamp, row_number() over(order by timestamp) rn 
    from table1 
) 
select c1.value, sum(datediff(second, c1.timestamp, c2.timestamp)) diffInSeconds 
from cte c1 join cte c2 on c1.rn = c2.rn -1 
where month(c1.timestamp) = month(@date) and month(c2.timestamp) = month(@date) 
group by c1.value 
Các vấn đề liên quan