仅获取每个名称的最新日期的行
Posted
技术标签:
【中文标题】仅获取每个名称的最新日期的行【英文标题】:Get only rows with the latest date for each name 【发布时间】:2021-12-05 17:54:32 【问题描述】:我正在尝试编写一个查询,它只返回那些包含每个名称的最新日期的行。
例如,这个数据:
Name | Date Sold | More Columns... |
---|---|---|
Bob | 2021-01-05 | |
Mike | 2021-01-18 | |
Susan | 2021-01-23 | |
Bob | 2021-02-04 | |
Susan | 2021-02-16 | |
Mike | 2021-03-02 |
会产生这样的结果:
Name | Date Sold | More Columns... |
---|---|---|
Bob | 2021-02-04 | |
Susan | 2021-02-16 | |
Mike | 2021-03-02 |
有点像GROUP BY
,但我没有汇总任何内容。我只想过滤原始行。
我怎么能写这样的查询?
注意:最后,这将是一个 SQL Server 查询,但我需要使用实体框架编写它。
更新:实际上,这是一个更复杂的查询的一部分。对我来说,将其实现为原始 SQL 查询将非常困难。如果可能的话,我需要使用实体框架来实现。
【问题讨论】:
这能回答你的问题吗? Get top 1 row of each group @SMor:看起来很相似,但我认为这种方法在实体框架中是不可能的。 也许将行号放在视图中,然后在 EF 中选择 【参考方案1】:两种选择
Select top 1 with ties *
From YourTable
Order by row_number() over (partition by Name order by Sold_Date desc)
或性能略高
with cte as (
Select *
,RN = row_number() over (partition by Name order by Sold_Date desc)
From YourTable
)
Select *
From cte
Where RN=1
【讨论】:
谢谢,但在您的第一个示例中,ties *
是什么?另外,我是否假设您是 SQL Server 人员,而不是实体框架人员?
@JonathanWood 你是对的...跳过了 EF。【参考方案2】:
改编自 Error while flattening the IQueryable<T> after GroupBy()
var names = _context.Items.Select(row => row.Name).Distinct();
var items =
from name in names
from item in _context.Items
.Where(row => row.Name == name)
.OrderByDescending(row => row.DateSold)
.Take(1)
select item;
var results = items.ToArrayAsync();
让我们分解一下:
为我们的下一个查询建立键的查询表达式。最终将作为子查询运行。
var names = _context.Items.Select(row => row.Name).Distinct();
另一个查询,从键开始...
var items =
from name in names
...对于每个键,让我们找到匹配的行...
from item in _context.Items
.Where(row => row.Name == name)
.OrderByDescending(row => row.DateSold)
.Take(1)
...我们想要那一行。
select item;
运行组合查询。
var results = items.ToArrayAsync();
【讨论】:
我需要重读几十遍,直到它有意义为止。【参考方案3】:试试这个
;with Groups as
(
Select [Name], max([Date Sold]) as [Date Sold]
From Table
Group By [Name]
)
Select Table.* From Groups
Inner Join Table on Table.[Name] = Groups.Name And Table.[Date Sold] = Groups.[Date Sold]
【讨论】:
但是,如上所述,我需要行中的所有列。 哦,我知道了,我很快就会改变我的答案@JonathanWood @JonathanWood 我现在编辑我的答案,您可以使用该过滤器获取所有列以上是关于仅获取每个名称的最新日期的行的主要内容,如果未能解决你的问题,请参考以下文章
SQL+获取具有最新日期的行+row_number()+重复时的情况