记录之间的SQL时间持续时间

时间:2014-02-18 10:57:38

标签: c# sql linq

我有下表:

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语句将是理想的。

1 个答案:

答案 0 :(得分: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
    });

更新“您能否在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

相关问题