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

Get only rows with the latest date for each name

我正在尝试编写一个查询,returns 只有那些包含每个姓名的最新日期的行。

例如,这个数据:

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 服务器查询,但我需要使用 Entity Framework.

来编写它

更新: 实际上,这是更复杂查询的一部分。我很难将其作为原始 SQL 查询来实现。如果可能的话,我需要使用 Entity Framework.

来实现

试试这个

;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]

两个选项

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

改编自

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();