Это возможный дубликат других вопросов с разделением по + рангу, но я нашел большинство этих вопросов/ответов слишком специфичными для их конкретной бизнес-логики. То, что я смотрю на это более общий вариант LINQ следующего типа запроса:LINQ (to Oracle) - Row_Number() Over Partition By
SELECT id,
field1,
field2,
ROW_NUMBER() OVER (PARTITION BY id
ORDER BY field1 desc) ROWNUM
FROM someTable;
Очень часто, что мы делаем с этим, чтобы обернуть его, как в чем-то вроде этого:
SELECT id,
field1,
field2
FROM (SELECT id,
field1,
field2,
ROW_NUMBER() OVER (PARTITION BY id
ORDER BY field1 desc) ROWNUM
FROM someTable)
WHERE ROWNUM = 1;
Что возвращает строку, содержащую наибольшее значение в поле1 для каждого идентификатора. Изменение порядка с помощью курса, конечно, вернет наименьшее значение или изменит ранг на 2, получит второе наивысшее/низкое значение и т. Д. И т. Д. Есть ли способ написать запрос LINQ, который может быть выполнен на стороне сервера, что дает нам такая же функциональность? В идеале, тот, который, как и выше.
Edit: Я пробовал множество различных решений после соскабливать в Интернете, и все они в конечном итоге дает мне ту же проблему, что ответ Рида ниже делает, поскольку SQL генерируется включает APPLY
.
Пару примеров я попробовал:
from p in db.someTable
group p by p.id into g
let mostRecent = g.OrderByDescending(o => o.field1).FirstOrDefault()
select new {
g.Key,
mostRecent
};
db.someTable
.GroupBy(g => g.id, (a, b) => b.OrderByDescending(o => o.field1).Take(1))
.SelectMany(m => m);
Оба эти результата очень похожи, если не идентичны, код SQL, которая использует OUTER APPLY
, что Oracle не поддерживает.
Для меня это кажется простой GROUP BY 'id' и' MAX (field1) '. Я что-то пропустил? –
@FrancisP В текущей форме, да. Но что, если я не хочу MAX и хотел бы второго или третьего вместо этого? Я снял акцент на этой конкретной части. – Kittoes0124
@ Kittoes Тот же метод должен работать, добавляя вызов «Пропустить», а затем отфильтровывая любые пустые результаты ... –