替代TOP或LIMIT条款?

时间:2016-03-18 18:05:25

标签: sql openaccess

我正在寻找下面查询中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个引擎,只有一个如下所示。每月大约180K行。

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 个答案:

答案 0 :(得分: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
)) 
相关问题