Entity Framework GroupBy, выберите мин и макс - PullRequest
0 голосов
/ 18 марта 2019

Мне нужна помощь со сложным запросом в EF.

Что я пытаюсь сделать:

Для каждого пользователя в списке получить список первого и последнего события для каждогодень из таблицы со следующей структурой:

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

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

Что я сейчас делаю:

  1. получение списка пользователей, которые меня интересуют
  2. для каждого пользователя получите все события за месяц
  3. итерация по событиям для выбора первого и последнего события для каждого дня.

Это довольно неэффективно и требует много времени.Я думаю, что я мог бы сделать:

Выберите минимальное и максимальное события из месяца, сгруппированные по UserId, сгруппированные по Дню, так что конечный результат будет выглядеть так:

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 голосов
/ 18 марта 2019

Вы можете использовать функции окна:

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, если у вас естьопределенный список пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...