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
现在,从上表中我想找出输出的方式,它给出了机器 A 处于活动状态的次数以及2分钟窗口中处于非活动状态的次数。因此需要每两分钟完成聚合。像 A 一样,从10.10-10.11开始两次无效,0次有效。如何表示输出表的最佳方法
有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
答案 0 :(得分: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)
;
答案 1 :(得分: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)