Формулировка запроса агрегации и метки времени в MS SQL

    time stamp        meter name  parameter name        value
2014-02-18 18:58:00      1$SGP          A          415.7806091308594
2014-02-18 18:58:00      1$SGP           B          240.3373565673828
2014-02-18 18:58:01      2$SGP           A          393.191162109375
2014-02-18 18:58:02      2$SGP           B           50.10090637207031
2014-02-18 18:58:00      3$SGP           A          3484841472
2014-02-18 18:05:01      1$SGP           A          0
2014-02-18 17:58:01      1$SGP           A          0
2014-02-18 17:58:01      2$SGP           A          290
2014-02-18 17:58:01      2$SGP           D          0
2014-02-18 17:58:01      3$SGP           A          3061691904
2014-02-18 17:57:01      3$SGP           A          0
2014-02-18 17:57:02      3$SGP           B          0

найти разницу в метках времени двух последовательных меток времени и разницу их значения для каждого отдельного счетчика по тому или иному параметру.

Ожидаемый результат: на 18:58.

01:00 1$SGP 415.7806091308594-0 01:00 2$SGP 393.191162109375-290 01:00 3$SGP 3484841472-3061691904

В 18:58 1$SGP,2$SGP и 3$SGP значения броска для параметра A. В 17:58 1$SGP,2$SGP и 3$SGP значения броска для параметра A. Остальные либо все счетчики отсутствуют вместе для отметки времени, например, 18:05. Секунды в отметке времени можно игнорировать. Так,

01:00 1$SGP 415.7806091308594-0 01:00 2$SGP 393.191162109375-290 01:00 3$SGP 3484841472-3061691904

Столкнулся с проблемой при составлении запроса в MS SQL. Я также не знаком с методом convert для игнорирования второго, который в mysql может быть обработан с помощью date_format().


person Arun    schedule 01.04.2014    source источник


Ответы (1)


Вот примерная таблица:

create table #t(ts datetime, mn char(5), pn char, val decimal (25,15));

insert #t values 
('2014-02-18 18:58:00',      '1$SGP',           'A',          415.7806091308594),
('2014-02-18 18:58:00',      '1$SGP',           'B',          240.3373565673828),
('2014-02-18 18:58:01',      '2$SGP',           'A',          393.191162109375),
('2014-02-18 18:58:02',      '2$SGP',           'B',           50.10090637207031),
('2014-02-18 18:58:00',      '3$SGP',           'A',          3484841472),
('2014-02-18 18:05:01',      '1$SGP',           'A',          0),
('2014-02-18 17:58:01',      '1$SGP',           'A',          0),
('2014-02-18 17:58:01',      '2$SGP',           'A',          290),
('2014-02-18 17:58:01',      '2$SGP',           'D',          0),
('2014-02-18 17:58:01',      '3$SGP',           'A',          3061691904),
('2014-02-18 17:57:01',      '3$SGP',           'A',          0),
('2014-02-18 17:57:02',      '3$SGP',           'B',          0);

И вот запрос:

;with t as (
    select cast(ts as smalldatetime) as ts, mn, pn, val from #t
)
,
tt as (
    select ts from t
    group by ts
    having count(*) >= 3
),
ttt as (
    select *, row_number() over(partition by mn, pn order by ts desc) as rn
    from t where t.ts in (select tt.ts from tt)
)
select t1.ts, t1.mn, t1.val, t2.val
from ttt t1
inner join ttt t2 on t1.mn = t2.mn and t1.pn = t2.pn and t1.rn = 1 and t2.rn = 2;
person dean    schedule 01.04.2014
comment
Если этот ответ был вам полезен, пожалуйста, примите / проголосуйте, чтобы другие могли извлечь из этого пользу. - person dean; 03.04.2014