2015-02-26 3 views
0

Может ли кто-нибудь помочь мне с заданием ниже MySQL, пожалуйста?MysQL - Совокупное разделение строк по дате времени

Указанные данные разбиты по часам в течение выбранной даты. Если device_table указывает, что устройство недоступно в течение нескольких часов, оно будет сообщаться в течение каждого из этих часов, например. если устройство записи проводятся для устройства следующим образом,

select * from device_table 

+----+---------------------+---------------------+--------+ 
| id | Start_timestamp | End_timestamp | STATUS | 
+----+---------------------+---------------------+--------+ 
| 1 | 28/11/2014 13:26:25 | 28/11/2014 13:36:22 | UP  | 
| 2 | 28/11/2014 13:36:23 | 28/11/2014 14:06:27 | DN  | 
| 3 | 28/11/2014 14:06:28 | 28/11/2014 14:06:28 | UP  | 
| 4 | 28/11/2014 14:06:29 | 28/11/2014 14:11:26 | DN  | 
+----+---------------------+---------------------+--------+ 

Затем устройство будет сообщено как недоступные, как в часах 13:00 14:00 & как вторая запись падает в обоих этих часов, и последняя запись также падает в час 14:00.

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

Я хочу что-то вроде этого, если устройство выключено с 28/11/2014 13:36:23 по 28/11/2014 14:06:27, тогда мой запрос должен считать устройство выключено в 2 часа т.е. 13:36:23 & 14:06:27 а также, если мое устройство отключено на 28/11/2014 13:36:23 t0 28/11/2014 13:46:27, тогда мое устройство должно быть указано как один час только то 13,00 часов

выходной сигнал запроса должен быть как ниже

+-------+----+-------+-----------------+ 
| Hours | up | down | total(UP+DOWN) | 
+-------+----+-------+-----------------+ 
| 00.00 | 1 |  0 |    1 | 
| 01.00 | 1 |  1 |    2 | 
| 02.00 | 0 |  0 |    0 | 
| : : | |  |     | 
| : : | |  |     | 
| 23:00 | 0 |  1 |    1 | 
+-------+----+-------+-----------------+ 
+0

как насчет использования concat ?? –

+0

concat, на котором Авинаш? –

ответ

0

Дайте следующий запрос попробовать.

SELECT `tab_a`.`ID`, `tab_a`.`start-date-time`, `tab_a`.`end-date-time`, 
    `tab_a`.`timediff`, `tab_a`.`status` 
FROM `tab_a` 
INNER JOIN (
    SELECT `tens`.`count` * 10 + `ones`.`count` AS `num-hours` 
    FROM (
    SELECT 1 AS `count` UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION 
    SELECT 9 UNION SELECT 10 
) `ones` 
    CROSS JOIN (
    SELECT 1 AS `count` UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION 
    SELECT 9 UNION SELECT 10 
) `tens` 
) `increment` 
    ON (
    `tab_a`.`start-date-time` + INTERVAL `increment`.`num-hours` HOUR 
    < `tab_a`.`end-date-time` 
) 

решение Добавлена ​​модифицированном вопрос

Следующий запрос должен делать то, что Вы желаете, за предыдущий период семь дней.

SELECT `dates`.`date`, `times`.`hour`, 
    CASE WHEN (COALESCE(COUNT(`device_up`.`ID`), 0) > 0) THEN 1 ELSE 0 END AS `up`, 
    CASE WHEN (COALESCE(COUNT(`device_dn`.`ID`), 0) > 0) THEN 1 ELSE 0 END AS `down`, 
    CASE WHEN (COALESCE(COUNT(`device_up`.`ID`), 0) > 0) THEN 1 ELSE 0 END + CASE WHEN (COALESCE(COUNT(`device_dn`.`ID`), 0) > 0) THEN 1 ELSE 0 END AS `up-down` 
FROM (
    SELECT DATE_FORMAT(NOW() - INTERVAL `count` DAY, '%Y-%m-%d') AS `date` 
    FROM (
    SELECT 1 AS `count` UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
    SELECT 5 UNION SELECT 6 UNION SELECT 7 
) `ones` 
) `dates` 
CROSS JOIN (
    SELECT `sixes`.`count` * 4 + `fours`.`count` AS `hour` 
    FROM (
    SELECT 0 AS `count` UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION 
    SELECT 4 UNION SELECT 5 
) `sixes` 
    CROSS JOIN (
    SELECT 0 AS `count` UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 
) `fours` 
) `times` 
LEFT JOIN (
    SELECT `ID`, `Start_timestamp`, `End_timestamp` 
    FROM `device_table` 
    WHERE (`status` = 'UP') 
) `device_up` 
    ON (
    (`device_up`.`Start_timestamp` < `dates`.`date` + INTERVAL `times`.`hour` + 1 HOUR) 
    AND (`device_up`.`End_timestamp` > `dates`.`date` + INTERVAL `times`.`hour` HOUR) 
) 
LEFT JOIN (
    SELECT `ID`, `Start_timestamp`, `End_timestamp` 
    FROM `device_table` 
    WHERE (`status` = 'DN') 
) `device_dn` 
    ON (
    (`device_dn`.`Start_timestamp` < `dates`.`date` + INTERVAL `times`.`hour` + 1 HOUR) 
    AND (`device_dn`.`End_timestamp` > `dates`.`date` + INTERVAL `times`.`hour` HOUR) 
) 
GROUP BY `dates`.`date`, `times`.`hour` 
ORDER BY `dates`.`date`, `times`.`hour` 
+0

Спасибо за быстрый ответ paul rowe. но если разность времени составляет 2 часа, он должен разделить 2 строки, если разность времени составляет 12 часов для начала времени окончания, которое он должен разбить на 12 записей, таких как мудрый. вышеупомянутый запрос разбивает только 2 записи за каждый часовой штамп внизу –

+0

@TobyWintio посмотрю. Я неправильно понял требования. Позвольте мне подумать об этом немного больше. –

+1

Большое спасибо за вашу поддержку. –

1

Какая у вас верхняя граница на timediff?

select * 
from tab_a as t, 
    (select 0 as n union all select 1 union all select 2...) as duplicator 
where t.timediff < duplicator.n 
Смежные вопросы