Проблемы с SQL-запросом - PullRequest
       2

Проблемы с SQL-запросом

0 голосов
/ 16 декабря 2011

Мне нужна помощь с таблицей sql.

Таблица содержит следующие столбцы:

EventID, PersonID, EventType, EventTime (datetime) и несколько других менее значимых столбцов.

Допустим, два основных типа событий - это открытие двери и закрытие двери.

Мне нужна продолжительность (в секундах), в течение которой один и тот же человек открывает дверь и закрывает еедверь и открытие другой. (это, конечно, позволяет просто открывать двери)

Просто чтобы было ясно, если человек 1 открыл дверь, а человек 2 закрыл дверь, в запросе не должно быть строк.

Я бы хотел, чтобы он был эффективным, но это не обязательно.

Я использую сервер Microsoft SQL Server 2008 (SQLEXPRESS)

Вот примертаблица:

EventID | PersonID | EventType | EventDate                | PreviousDoor | CurrentDoor
   1    |    1     |    1      | 12/10/2010 12:00:01.024  |      0       |     23
   2    |    1     |    2      | 12/10/2010 12:05:40.758  |      23      |     0
   3    |    2     |    1      | 12/10/2010 12:12:05.347  |      0       |     12
   4    |    1     |    1      | 12/10/2010 12:50:12.142  |      0       |     23
   5    |    2     |    2      | 12/10/2010 13:00:06.468  |      12      |     23
   6    |    3     |    1      | 13/10/2010 13:00:06.468  |      0       |     23

Тип события: 1 (Открытая дверь), 2 (Закрытая дверь)

Результат должен быть:

EventID | PersonID | EventType | EventDate                | SecondsDifference
   1    |    1     |    1      | 12/10/2010 12:00:01.024  | 339
   3    |    2     |    1      | 12/10/2010 12:12:05.347  | 2881

Я действительно могу использовать ваших ребятпомощь.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Попробуйте что-то вроде этого:

select t1.EventID, t1.PersonID, t1.EventType, t1.EventDate, datediff(second, t1.EventDate, t2.EventDate) as 'SecondsDifference'
from [Event] t1
inner join [Event] t2 on t2.PersonID = t1.PersonID and t2.EventType = 2 and t2.PreviousDoor = t2.CurrentDoor and t2.EventID < t1.EventID
where t1.EventType = 1
1 голос
/ 17 декабря 2011

Поможет ли использование ROW_NUMBER и PARTITION?Я не уверен, является ли следующее заявление SQL допустимым, поэтому, пожалуйста, рассматривайте его как полупсевдокод.

SELECT *, 
  ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY EventTime) AS RowNumber,
  datediff(seconds, t2.EventTime, t1.EventTime) AS SecondsDiff
FROM Events t1 
  INNER JOIN 
    SELECT *,
      ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY EventTime) AS RowNumber 
    From Events t2 
  ON t1.RowNumber + 1 = t2.RowNumber 
    AND t1.PersonID = t2.PersonID AND t1.EventType = 1 
    AND (t2.EventType = 1 OR t2.EventType = 2)
1 голос
/ 16 декабря 2011

Я думаю, что это должно сделать это:

    SELECT          p1.EventID,
                    p1.PersonID,
                    p1.EventType,
                    p1.EventDate,
                    DATEDIFF(SECOND, p1.EventDate, p2.EventDate) AS SecondsDifference
    FROM            [Event] p1
    LEFT JOIN       [Event] p2  --Left join to self returning only closed door events
    ON              p2.PersonID = p1.PersonID
    AND             p2.EventType = 2 -- Closed Door
    AND             p1.EventID < p2.EventID --We don't want to bring back events that happened before the next event
    WHERE           p2.EventID IS NOT NULL --We don't want to show any people that have not closed a door
...