2013-07-09 201 views
0
MachineID Active_Inactive Time 
    A    0  10.10 am 
    A    0  10.11 am 
    A    1  10.12 am 
    A    0  10.13 am 
    A    0  10.14 am 
    A    0  10.15 am 
    A    1  10.16 am 
    A    1  10.17 am 
    A    1  10.18 am 

現在,從上表我想找出的方式輸出,它給了我一個多少次機活躍,有多少次不活躍在一個2分鐘的窗口。所以聚合需要每兩分鐘完成一次。類似於A從10.10-10.11兩次失效2-次,並且0次有效。如何是表示輸出表的最佳途徑彙總數據SQL

有5個插槽

10.10-10.11(1), 10.12-10.13(2) and so on... 

輸出應該是這個樣子..

Slots Active A Inactive A 
    1  0   2 
    2  1   1 
    3  0   2 
    4  1   1 
    5  2   0 
+1

你是什麼active_inactive時間列的數據類型? –

+0

你正在使用哪些DBMS?甲骨文? Postgres的? –

+0

我使用Sequel服務器 – SouravD

回答

1

假設時間日期類型,這是我會做的。注意這是在oracle上。但它應該差別不大。

CREATE TABLE temp (
    Machine nvarchar2 (10), 
    Active number, 
    dt date 
); 

INSERT INTO temp VALUES ('A', 0, to_date('10.10 am', 'hh.mi am')); 
INSERT INTO temp VALUES ('A', 0, to_date('10.11 am', 'hh.mi am')); 
INSERT INTO temp VALUES ('A', 1, to_date('10.12 am', 'hh.mi am')); 
INSERT INTO temp VALUES ('A', 0, to_date('10.13 am', 'hh.mi am')); 
INSERT INTO temp VALUES ('A', 0, to_date('10.14 am', 'hh.mi am')); 
INSERT INTO temp VALUES ('A', 0, to_date('10.15 am', 'hh.mi am')); 
INSERT INTO temp VALUES ('A', 1, to_date('10.16 am', 'hh.mi am')); 
INSERT INTO temp VALUES ('A', 1, to_date('10.17 am', 'hh.mi am')); 
INSERT INTO temp VALUES ('A', 1, to_date('10.18 am', 'hh.mi am')); 

Select 
    Machine, 
    Active, 
    to_char(dt, 'hh') || '.' || to_char(floor(to_char(DT, 'mi') /2) * 2) || '-' || to_char(dt, 'hh') || '.' || to_char(floor(to_char(DT, 'mi') /2) * 2 + 1) timeGroup 
from temp 
group by Machine, Active, to_char(dt, 'hh') || '.' || to_char(floor(to_char(DT, 'mi') /2) * 2) || '-' || to_char(dt, 'hh') || '.' || to_char(floor(to_char(DT, 'mi') /2) * 2 + 1) 
; 
+0

+1尼斯解決方案! – niktrs

0

您可以使用轉換,字符串和日期函數來創建分組

SELECT machine_id, active_inactive,CONVERT(VARCHAR(13),time,21)+ ':'+RIGHT ('00'+FLOOR(CAST(DATEPART(minute,time)/2) *2 AS VARCHAR(2)),2), COUNT(*) 
FROM yourtable 
GROUP BY machine_id, active_inactive, CONVERT(VARCHAR(13),time,21)+ ':'+RIGHT ('00'+FLOOR(CAST(DATEPART(minute,time)/2) *2 AS VARCHAR(2)),2)