2017-08-24 54 views
1

我對SQL很陌生,並且有一個複雜的搜索,我正試圖讓客戶工作。給定一個表格,我需要計算一個值超出範圍的次數,在這種情況下> 5,時間> 15分鐘。根據持續時間來計算數字超出範圍的事件

表格自2011年初以來每1分鐘就有一個唯一的條目,任何查詢限制爲5000條結果。

Tagname | TimeStamp    | Value 
------- | ----------------------- | ---- 
tag1 | 2011-01-01 00:00:00.000 | 4.67 
tag2 | 2011-01-01 00:00:00.000 | 4.66 
tag3 | 2011-01-01 00:00:00.000 | 4.68 
tag1 | 2011-01-01 00:01:00.000 | 4.63 
... 

什麼我想要做的僞代碼是一樣的東西

Count( 
    SELECT TimeStamp, Value FROM rawData WHERE rawData.Tagname = 'tag1' AND 
    (Value > 5 for 15 minutes) 
) 

這流失的古GE歷史學家3.5有限語法安裝。我不需要高度優化的代碼,只需使用最基本的SQL命令即可。

回答

0

我從來沒有聽說過GE歷史學家,但這裏是認爲你的問題,應該使簡單基本的SQL解決辦法:

您需要SELECTWHERE Value > 5有不存在的用相同的標記名時間戳是這個後15分鐘內排,和值是< = 5

0

如果您使用的是SQL SERVER,也許你可以試試:

SELECT COUNT(TagName) 
FROM 
(
SELECT TagName,TimeStamp,Value,LAG(Value,14) OVER(PARTITION BY TagName, ORDER BY TIMESTAMP ASC) as TimeSpan_Value 
FROM rawData 
) as A 
WHERE A.TagName = 'tag1' AND A.Value >5 AND A.TimeSpan_Value >5 
+0

不幸的是,該系統沒有進入LAG命令。我曾經考慮過使用它。 – James

0

這裏有一個方法與相關子查詢

declare @table table (Tagname varchar(4), TS datetime, Val decimal(3,2)) 
insert into @table 
values 
('tag1','2011-01-01 00:00:00.000',4.67), 
('tag1','2011-01-01 00:01:00.000',5.67), 
('tag1','2011-01-01 00:02:00.000',6.67), 
('tag1','2011-01-01 00:03:00.000',6.67), 
('tag1','2011-01-01 00:04:00.000',4.67), 
('tag1','2011-01-01 00:05:00.000',5.67), --start of return rows 
('tag1','2011-01-01 00:06:00.000',5.67), 
('tag1','2011-01-01 00:07:00.000',6.67), 
('tag1','2011-01-01 00:08:00.000',6.67), 
('tag1','2011-01-01 00:09:00.000',7.67), 
('tag1','2011-01-01 00:10:00.000',7.67), 
('tag1','2011-01-01 00:11:00.000',7.67), 
('tag1','2011-01-01 00:12:00.000',7.67), 
('tag1','2011-01-01 00:13:00.000',7.67), 
('tag1','2011-01-01 00:14:00.000',7.67), 
('tag1','2011-01-01 00:15:00.000',7.67), 
('tag1','2011-01-01 00:16:00.000',7.67), 
('tag1','2011-01-01 00:17:00.000',7.67), 
('tag1','2011-01-01 00:18:00.000',7.67), 
('tag1','2011-01-01 00:19:00.000',7.67), --15 min mark 
('tag1','2011-01-01 00:20:00.000',7.67),  
('tag1','2011-01-01 00:21:00.000',7.67) 




;with cte as(
select 
    t.Tagname 
    ,t.TS 
    ,t.Val 
    ,OV = (select min(Val) from @table t2 where t2.Tagname = t.Tagname and t2.TS <= dateadd(minute,15,t.TS) and t2.TS >= t.TS) 
from 
    @table t) 


select 
    Tagname, 
    TS 
from 
    cte 
where Val >5 and OV > 5 

使用連接

;with cte2 as(
select 
    t.Tagname 
    ,t.TS 
    ,t.Val 
    ,OV = min(t2.Val) 
from 
    @table t 
    inner join 
    @table t2 on 
    t2.Tagname = t.Tagname and t2.TS <= dateadd(minute,15,t.TS) and t2.TS >= t.TS 
group by 
    t.Tagname 
    ,t.TS 
    ,t.Val) 

select * 
from cte2 
where val> 5 and OV > 5 
+0

我會在下一次嘗試這個系統,這是一個僅限本地的網絡,而且我每個月只有幾次在現場。謝謝! – James

+0

沒問題。如果它適合你,請務必檢查背部和UV /接受。 – scsimon