实体框架GroupBy,选择最小和最大

时间:2019-03-18 11:12:38

标签: sql .net performance entity-framework linq

我需要一些有关EF中复杂查询的帮助。

我正在尝试做的事情:

对于列表中的每个用户,请从具有以下结构的表格中获取每天的首个事件和最后一个事件的列表:

Events table:
int EventId
int UserId
DateTime Time
...other fields

Users table:
int UserId
string Name
...other fields

我目前正在做什么:

  1. 获取我感兴趣的用户列表
  2. 为每个用户获取一个月内的所有事件
  3. 遍历事件以选择每天的第一个和最后一个事件。

这是非常低效且耗时的。我想我可以做的是:

从一个月中选择最小和最大事件,按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中的实体框架进行此操作

1 个答案:

答案 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子句。