仅获取每个名称的最新日期的行

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 我现在编辑我的答案,您可以使用该过滤器获取所有列

以上是关于仅获取每个名称的最新日期的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Git 的当前分支中获取最新的标签名称?

SQL+获取具有最新日期的行+row_number()+重复时的情况

从 ROW_NUM 中仅选择编号最大的行以获取最新更新

我只想查看具有最新报告日期的行

在 Sqlite 中,为不同列中返回的每个名称获取前 2 个

获取每个 id 的最新记录