【问题标题】:Entity framework GroupBy, Select min and max实体框架GroupBy,选择最小值和最大值
【发布时间】:2019-03-18 11:12:38
【问题描述】:

我需要一些关于 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 中使用实体框架来完成这项工作

【问题讨论】:

    标签: sql .net performance entity-framework linq


    【解决方案1】:

    你可以使用窗口函数:

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

    【讨论】:

    • 我无法将其转换为 LINQ。此外,此查询是否不会返回整个时间段内的第一个和最后一个事件,而不为每一天创建子组?
    • @RazvanOlariu 。 . .这回答了以下问题:“对于列表中的每个用户,从具有以下结构的表中获取每天的第一个和最后一个事件的列表:”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多