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

现在,从上表中,我想以某种方式找出输出,它可以让我知道机器A在 2 分钟窗口内有多少次处于活动状态和多少次处于非活动状态。因此,需要每两分钟进行一次聚合。像A从 10.10 到 10.11 有 2 次不活跃和 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
4

2 回答 2

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)
;
于 2013-07-09T07:57:27.647 回答
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)
于 2013-07-09T08:02:12.297 回答