gpt4 book ai didi

sql-server - LINQ(到 Oracle)- Row_Number() Over Partition By

转载 作者:行者123 更新时间:2023-12-03 23:31:24 27 4
gpt4 key购买 nike

这可能与其他 Partition By + Rank 问题重复,但我发现这些问题/答案中的大多数都过于具体地针对其特定的业务逻辑。我正在寻找的是以下查询类型的更通用的 LINQ 版本:

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;

返回包含每个 id 的 field1 中最高值的行。将 order by 更改为 asc 当然会返回最低值,或者将等级更改为 2 将获得第二高/最低值等等。有没有一种方法可以编写一个可以在服务器端执行的 LINQ 查询,从而为我们提供同一种功能?理想情况下,性能与上述一样。

编辑:在搜索网络后,我尝试了许多不同的解决方案,但它们最终都给我带来了与 Reed 下面的回答相同的问题,因为生成的 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 代码使用了 Oracle 不支持的 OUTER APPLY

最佳答案

您应该能够执行以下操作:

var results = someTable
.GroupBy(row => row.id)
.Select(group => group.OrderByDescending(r => r.id).First());

如果你想要第三高的值,你可以这样做:

var results = someTable
.GroupBy(row => row.id)
.Select(group => group.OrderByDescending(r => r.id).Skip(2).FirstOrDefault())
.Where(r => r != null); // Remove the groups that don't have 3 items

关于sql-server - LINQ(到 Oracle)- Row_Number() Over Partition By,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15299301/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com