Альтернатива предложению 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

1 ответ

Возможно используя 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
)) 
Другие вопросы по тегам