2016-08-31 1 views
1

У меня есть список записей, представленных с помощью AlarmID, System, State и Raised ON.MS Access 2010, как рассчитать время между двумя записями - идентичный идентификатор, разное время

Одно событие представлено двумя записями, одним и тем же сигналом тревоги, сначала с состоянием «Вкл.», Вторым с «Состояние выключено» и временем ответа.

Это мой запрос:

SELECT * 
FROM [Alarmi_On-Off] 
WHERE [Alarmi_On-Off].[Alarm ID] IN (SELECT [Alarmi_On-Off].[Alarm ID] 
            FROM [Alarmi_On-Off] 
            GROUP BY [Alarmi_On-Off].[Alarm ID] 
            HAVING COUNT([Alarmi_On-Off].[Alarm ID]) > 1); 

и результат:

+---------+---------+-------+------------------+ 
| AlarmID | System | State | Raised On  | 
+---------+---------+-------+------------------+ 
| 1001 | System1 | On | 16.08.2016 14:23 | 
| 1001 | System1 | Off | 16.08.2016 16:17 | 
| 1002 | System2 | On | 27.06.2016 12:14 | 
| 1002 | System2 | Off | 27.06.2016 12:24 | 
| 1002 | System2 | On | 14.07.2016 03:37 | 
| 1002 | System2 | Off | 14.07.2016 03:38 | 
+---------+---------+-------+------------------+ 

Я хочу, чтобы создать запрос, который вычисляет разницу во времени между включением и состояние Off для каждой системы, имея в виду чтобы исключить все системы с менее чем двумя событиями (в приведенном выше примере исключить AlarmID 1001), что я пытался использовать с «COUNT».

В этом запросе вместо двух записей я бы одна запись с системой и расчетное время.

Любая помощь приветствуется.

ответ

0

Синтаксис (и, вероятно, производительность) в Access будет очень плохо для этого, но что-то, как это должно работать:

SELECT AlarmID,System, 
    (SELECT TOP 1 [Raised On] FROM [Alarmi_On-Off] 
    WHERE A.AlarmID = AlarmID 
    AND A.[Raised On] < [Raised On] 
    AND State = 'Off' ORDER BY [Raised On]) - [Raised On] AS Duration 
FROM [Alarmi_On-Off] AS A 
WHERE State = 'On' 
ORDER BY AlarmID,[Raised On] 

Обратите внимание, что значение Duration будет Double представляющих днями и дробные дни , Вы можете либо бросить его в Date или вытяжных даты и времени детали по мере необходимости с указанием даты и времени функции доступа, то есть:

SELECT AlarmID,System,HOUR(Duration) AS Hours, MINUTE(Duration) AS Minutes FROM 
(
SELECT AlarmID,System, 
    (SELECT TOP 1 [Raised On] FROM [Alarmi_On-Off] 
    WHERE A.AlarmID = AlarmID 
    AND A.[Raised On] < [Raised On] 
    AND State = 'Off' ORDER BY [Raised On]) - [Raised On] AS Duration 
FROM [Alarmi_On-Off] AS A 
WHERE State = 'On' 
ORDER BY AlarmID,[Raised On] 
) T 

Результаты с вашими данными выборки:

AlarmID System  Hours Minutes 
1001  System1 1  54 
1002  System2 0  10 
1002  System2 0  1 
0

You может использовать следующий запрос, чтобы найти разницу во времени между 'On' и 'Выкл.' состояние:

SELECT 
    start_log.AlarmID, 
    start_log.Rasied_On AS start_time, 
    end_log.Rasied_On AS end_time, 
    DATEDIFF(MINUTE, start_log.Rasied_On, end_log.Rasied_On) AS TimeInMin 
FROM 
    [Alarmi_On-Off] AS start_log 
INNER JOIN 
    [Alarmi_On-Off] AS end_log ON (
      start_log.AlarmID = end_log.AlarmID AND start_log.Rasied_On < end_log.Rasied_On) 
WHERE start_log.State = 'On' 
AND end_log.State = 'Off' 
GROUP BY start_log.AlarmID, start_log.Rasied_On, end_log.Rasied_On 

Выход я имею в виду разница во времени в минутах: Time Difference

+0

Я в конечном итоге с декартовым произведением времени начала и окончания, если есть более чем одна пара в AlarmId как в Access и SQL Сервер. – Comintern

+0

Огромное спасибо всем, я попробую на следующей неделе, когда вернусь в свой офис. – Vedran

Смежные вопросы