聚合数据SQL

时间:2013-07-09 07:38:33

标签: sql sql-server

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

2 个答案:

答案 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)