作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能与其他 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/
我是一名优秀的程序员,十分优秀!