我有下表:
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 :(得分: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