仅获取每个名称的最新日期的行
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();
我正在尝试编写一个查询,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();