выбрать строки из таблицы, где id = max - PullRequest
0 голосов
/ 13 мая 2018

У меня есть таблица, в которой несколько строк с одинаковыми ProcessID, но разными ID.Как выбрать строки с max ID и разными ProcessID в запросе SQL и Entity Framework?

Моя таблица:

ID     | ProcessID  | MESSAGE    | STATUS
-------+------------+------------+--------
100    | 100        | test       | 2
101    | 100        | test       | 2
102    | 100        | test       | 3
103    | 100        | test       | 4
104    | 104        | test       | 5
105    | 104        | test       | 6
106    | 104        | test       | 7
107    | 104        | test       | 8
108    | 104        | test       | 09

При поиске:

ID     | ProcessID  | MESSAGE    | STATUS
-------+------------+------------+---------    
103    | 100        | test       | 4
108    | 104        | test       | 09

Ответы [ 4 ]

0 голосов
/ 14 мая 2018

Как насчет простой группы по с max (id)

select max(id), processID, message, status   
from TableFoo  
group by processID

Он должен нести сообщение, статус с макс (id)

0 голосов
/ 13 мая 2018

Entity Framework предполагает, что вы используете SQL Server.Тогда вы можете использовать мой любимый метод, который не использует подзапрос:

select top (1) with ties t.*
from t
order by row_number() over (partition by processid order by id desc);
0 голосов
/ 14 мая 2018
var data = (from item in ctx.Processes
            group item by item.ProcessID into sub
            let maxId = sub.Max(x => x.ID)
            select new
            {
                ID = maxId,
                ProcessID = sub.Key,
                sub.Where(x => x.ID == maxId).First().MESSAGE,
                sub.Where(x => x.ID == maxId).First().STATUS
            }).ToList();

//or this variant
data = (from item in ctx.Processes
        join gr in (from temp in ctx.Processes
                    group temp by temp.ProcessID into sub
                    select sub.Max(x => x.ID))
        on item.ID equals gr
        select new
        {
            item.ID,
            item.ProcessID,
            item.MESSAGE,
            item.STATUS,
        }).ToList();
0 голосов
/ 13 мая 2018

Вы можете использовать ROW_NUMBER:

SELECT  ID, ProccessID, MESSAGE, STATUS 
FROM (SELECT *, 
         ROW_NUMBER() OVER(PARTITION BY ProcessID ORDER BY id DESC) AS rn
      FROM tab) sub
WHERE rn = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...