2016-03-18 4 views
1

Я ищу альтернативу предложения TOP или LIMIT в следующем запросе. Я хочу, чтобы результат был, когда состояние двигателя изменилось с предыдущего значения. Я собираюсь объединить другую таблицу в начале и в конце, чтобы у меня могло быть первое значение месяца и последнего значения месяца, но это не показано ниже, для простоты. В основном, я хочу, чтобы результаты столбцов в отчете, когда статус изменяется от одной строки к другой.Альтернатива предложению TOP или LIMIT?

SELECT A.pointidlong 
     , A.pointtime 
     , A.value 
FROM enginestatus A 
WHERE A.pointidlong = 'engine1' 
    AND A.pointtime > Now() - 30 
    AND A.value <> (SELECT TOP 1 B.value 
        FROM enginestatus B 
        WHERE B.pointidlong = A.pointidlong 
         AND B.pointtime < A.pointtime 
         AND B.pointtime > Now() - 30 
        ORDER BY B.pointtime DESC) 
ORDER BY pointidlong 
     , pointtime 

Небольшой набор данных ниже. В наборе данных имеется только 20 двигателей, показанных ниже. Около 180 тыс. Строк в месяц.

engine,  PointTime,   status 
'engine1', '2016-02-14 15:30:00', 'RUNNING' 
'engine1', '2016-02-14 15:36:00', 'RUNNING' 
'engine1', '2016-02-14 15:51:00', 'RUNNING' 
'engine1', '2016-02-14 16:06:00', 'STOPPED' 
'engine1', '2016-02-14 16:20:00', 'RUNNING' 
'engine1', '2016-02-14 16:35:00', 'RUNNING' 
'engine1', '2016-02-14 16:51:00', 'RUNNING' 
'engine1', '2016-02-14 17:05:00', 'STOPPED' 
'engine1', '2016-02-14 17:20:00', 'RUNNING' 
'engine1', '2016-02-14 17:35:00', 'STOPPED' 
'engine1', '2016-02-14 17:50:00', 'RUNNING' 
'engine1', '2016-02-14 18:05:00', 'RUNNING' 
'engine1', '2016-02-14 18:19:00', 'STOPPED' 
'engine1', '2016-02-14 18:36:00', 'RUNNING' 
'engine1', '2016-02-14 18:51:00', 'RUNNING' 

База данных работает с OpenAccess SQL, которая приведена ниже. TOP может использоваться, но не в подзапросе, производной таблице или в сочетании с объединением. Насколько мне известно, LIMIT не поддерживается.

http://media.datadirect.com/download/docs/openaccess/sdk/openaccess_sql.pdf

ответ

0

Возможно, с помощью MAX() будет работать:

(SELECT B.value 
FROM enginestatus B 
WHERE B.pointidlong = A.pointidlong 
AND B.pointtime < A.pointtime 
AND B.pointtime > Now() - 30 
AND B.pointtime = (SELECT MAX(pointtime) 
        FROM enginestatus 
)) 
Смежные вопросы