2015-04-02 4 views
0

Я работаю с базой данных, на которой написано несколько машин, каждая машина идентифицируется столбцом с именем ControllerID, поэтому, например, у одной машины может быть идентификатор контроллера 20, а один может быть 30 extsql server query with multiple where is

Что я хочу сделать, так это для каждой машины получить прошедшее время между последним чтением и сейчас. Это то, что я в настоящее время:

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

Это получает истекшие секунды между последним чтения и теперь, но если я ставлю и (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 из записей, прежде чем получить прошедшее время между записями? –

+0

@JoshKirkpatrick См. Обновленный ответ. –

0

Если вы хотите использовать OR так, как я думаю, вам нужно сгруппировать OR в() s, как показано ниже.

 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