2014-02-18 3 views
0

я в следующей таблице:SQL Time Продолжительность между записями

CamId RegNumber DateSeen 
5 G1234B 18/02/2014 11:54 
3 G1234B 18/02/2014 11:51 
5 G11854 18/02/2014 11:50 
3 G11854 18/02/2014 11:49 
3 G24581 18/02/2014 11:48 

мне нужно знать время, затрачиваемое с момента, когда регистрационный номер виден на CamId 3 до CamId 5, число р должно существовать в обоих CamId 3 и 5, чтобы это работало.

В результате я ищу список регистрационных номеров вместе с разницей во времени в секундах (для целей этой демонстрации в минутах):

RegNumber Duration 
G1234B    3 
G11854    1 

Затем я хочу, чтобы добавить все эти длительностей и получить среднее или среднее значение.

Надеюсь, кто-то может помочь, заявление linq sql будет идеальным.

+0

Является ли сочетание '' CamId' и RegNumber' уникальным? – musefan

+0

да, это должно было бы совпадать с одним и тем же номером регистра, и дата камеры 3 должна быть меньше, чем дата camid5 – Tommy

+0

, также могут быть другие записи, но она должна получить последние две доступные для рег-номера. например может быть 10 записей на кулачках id 5 и 10 записей на идентификаторе кулачка 3, но он должен использовать только самые последние значения – Tommy

ответ

1

Вы можете использовать Enumerable.GroupBy, затем выберите последнюю запись с CamId == 5, вычитать его с первой записью с CamId == 3 и использовать TimeSpan.TotalSeconds.

var query = db.Registration 
    .GroupBy(r => r.RegNumber) 
    .Select(grp => new 
    { 
     RegNumber = grp.Key, 
     Duration = (grp.Where(r => r.CamId == 5) 
         .OrderByDescending(r => DateSeen) 
         .Select(r => r.DateSeen) 
         .FirstOrDefault() 
        - grp.Where(r => r.CamId == 3) 
         .OrderBy(r => DateSeen) 
         .Select(r => r.DateSeen) 
         .FirstOrDefault()).TotalSeconds 
    }); 

Update: "Вы были бы в состоянии обеспечить указанное в операторе SQL?"

WITH CTE AS 
(
    SELECT [CamId], [RegNumber], [DateSeen], 
     Duration = DATEDIFF(second, 
          (SELECT MIN(DateSeen)FROM dbo.Registration r2 
          WHERE r1.RegNumber=r2.RegNumber 
          AND r2.CamId = 3), 
          (SELECT MAX(DateSeen)FROM dbo.Registration r2 
          WHERE r1.RegNumber=r2.RegNumber 
          AND r2.CamId = 5)), 
     RN = ROW_NUMBER() OVER (PARTITION BY RegNumber ORDER BY DateSeen) 
    FROM dbo.Registration r1 
) 
SELECT [RegNumber], [Duration] 
FROM CTE 
WHERE [Duration] IS NOT NULL AND RN = 1 

Demo

+0

, но результаты не возвращаются. – Tommy

+0

@Tommy: В главном запросе нет 'Where', поэтому он будет возвращать все записи, сгруппированные по' RegNumber'. Что делает 'query.ToList(). Count' return? –

+0

возвращает ошибку «ArgumentException был необработанным». Аргументы DbArithmeticExpression должны иметь числовой общий тип. – Tommy

Смежные вопросы