2015-04-02 105 views
0

我正在处理一个有多台机器写入数据库的数据库,每台机器都由一个名为ControllerID的列标识,因此例如,一台机器的控制器ID可以是20,一个可以是30分机sql server query multiple with

我想要做的是为每台机器获取上次阅读和现在之间的经过时间。这是我目前有:

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也不起作用因为它只是选择最后一个,我怎么能做到这一点?

回答

1

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

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

这将会给您提供有关过去的ReaderTime和差异从去年dtReading到现在每个controllerID

UPDATE:

在一个侧面说明,如果我想在过去的2个记录比较每个controllerID我怎么能做到这一点...

那么,作为“快速和肮脏“解决方案,你不能做以下:从以前的查询结果和这样的外部应用通过以前的时间间隔记录:

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 
+0

完美的作品谢谢你,在一个侧面说明,如果我想在过去的2个记录比较每个controllerID我怎么能做到这一点,所以DtReading从最后一个记录减去Dtreading从记录之前,获取记录之间的经过时间? – 2015-04-02 15:20:13

+0

@JoshKirkpatrick查看更新的答案。 – 2015-04-02 16:07:18

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 
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