具有多个where的sql server查询

时间:2015-04-02 15:04:59

标签: sql sql-server

我正在使用一台有多台机器写入数据库的数据库,每台机器都由一个名为ControllerID的列标识,例如,一台机器的控制器ID可能为20,其中一台可能是30分机

我想要做的是每台机器获取最后一次读数和现在之间的经过时间。这就是我目前所拥有的:

SELECT     TOP (1) controllerID, convert(Datetime,ReaderTime), DATEDIFF(SECOND,dtReading,GETDATE())
FROM         ReaderData
WHERE     (controllerID = '30') AND (CardID = 'FFFFFFF0  ')
ORDER BY ReaderIndex DESC

这得到了最后一次读数和现在之间的经过时间,但是如果我把AND(controllerID ='另一个ID')显然不会起作用而且OR也不起作用,因为它只是选择最后一个一,我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

如果正确理解了你的目标,你需要像

这样的东西
select
    controllerID,
    max(convert(datetime, ReaderTime)),
    datediff(ss, max(dtReading), getdate())
from ReaderData
where CardID = 'FFFFFFF0  '
group by controllerID

这将为您提供有关每个ReaderTime的上一次dtReading以及与上一次controllerID之间的差异的信息。

更新:

在旁注中,如果我想比较每个controllerID的最后2条记录,我该怎么办...

好吧,作为“快速而肮脏”的解决方案,你无法做到以下几点:从以前的查询得到结果,外部应用之前的时间间隔记录如下:

select 
    T.controllerID,
    datediff(ss, T.Max_dtReading, T1.Max_dtReading)
from 
    (
        select
            controllerID,
            max(dtReading) as Max_dtReading
        from ReaderData
        where CardID = 'FFFFFFF0  '
        group by controllerID
    ) as T
    outer apply(
        select max(T1.dtReading) as Max_dtReading
        from ReaderData as T1
        where 
            T1.CardID = 'FFFFFFF0  '
            and T1.controllerID = T.controllerID
            and T1.dtReading < T.Max_dtReading
    ) as T1

答案 1 :(得分:0)

如果你想以我认为的方式使用OR,你需要将()中的OR分组如下。

       SELECT     TOP (2) controllerID, convert(Datetime,ReaderTime), DATEDIFF(SECOND,dtReading,GETDATE())
        FROM         ReaderData
        WHERE     (controllerID = '30' OR controllerID = '31' OR controllerID = '32') AND CardID = 'FFFFFFF0  '
        ORDER BY ReaderIndex DESC
GROUP BY ControllerID

答案 2 :(得分:0)

您想使用IN()?

SELECT     TOP (1) controllerID, convert(Datetime,ReaderTime), DATEDIFF(SECOND,dtReading,GETDATE())
FROM         ReaderData
WHERE     (controllerID in( '30','26')) AND (CardID = 'FFFFFFF0  ')
ORDER BY ReaderIndex DESC