我需要一些有关EF中复杂查询的帮助。
我正在尝试做的事情:
对于列表中的每个用户,请从具有以下结构的表格中获取每天的首个事件和最后一个事件的列表:
Events table:
int EventId
int UserId
DateTime Time
...other fields
Users table:
int UserId
string Name
...other fields
我目前正在做什么:
这是非常低效且耗时的。我想我可以做的是:
从一个月中选择最小和最大事件,按UserId分组,按Day分组,因此最终结果将如下所示:
EventId UserId Time
345 4 9:00:00 18.03.2019 //first event from 18.03
456 4 18:20:00 18.03.2019 //last event from 18.03
465 4 10:40:00 19.03.2019 //first event from 19.03
477 4 19:23:00 19.03.2019 //first event from 19.03
360 9 11:05:00 18.03.2019 //same, for different user
440 9 17:10:00 18.03.2019
466 9 10:57:00 19.03.2019
501 9 20:48:00 19.03.2019
我需要使用.Net中的实体框架进行此操作
答案 0 :(得分:0)
您可以使用窗口功能:
select e.*
from (select e.*,
row_number() over (partition by userid, convert(date, time) order by time) as seqnum,
count(*) over (partition by userid, convert(date, time)) as cnt
from events e
) e
where e.seqnum = 1 or e.seqnum = cnt;
如果需要,您可以JOIN
输入其他用户信息。
如果您有特定的用户列表,则可以添加WHERE
子句。