Select每组记录只有最近的记录
Select only most recent record for each group of records
我有一个如下所示的数据库实体:
public class History
{
public int Id {get; set;}
public string Text {get; set;}
public DateTime DateTime {get; set;}
}
在 db 中可以有多个具有相同 Text
值的记录,我只需要获取其中的那些记录,它们是每个不同 'Text' 的最新(最新)记录 -所以对于每个 Text
值我应该只得到一个最新记录。
例如 db table 命名历史:
id | text | dateTime
---------------------
1 abc 2018-01-05
2 qqq 2018-01-08
3 abc 2018-01-01
4 qqq 2018-05-05
5 abc 2018-01-03
查询结果应该是这样的:
1 abc 2018-01-05
4 qqq 2018-05-05
现在,我正在使用 nHibernate 这样做:
var historyGroups = _session.Query<History>
.OrderBy(x => x.DateTime)
.GroupBy(x => x.Text)
.ToArray();
然后为每个组选择最后一项 - 但它获取了很多我不需要的数据。
如何以更有效的方式实现这一点,通过 LINQ to SQL 或通过纯 SQL?
您应该在 之前分组 订购:
var historyGroups = _session.Query<History>
.GroupBy(x => x.Text)
.Select(x => new { text = x.Key, latest = x.First(y => y.DateTime == x.Select(z => z.DateTime).Max()) })
.ToArray();
我最终使用了这样的原始 SQL:
var data = _session.CreateSQLQuery("select distinct on (text) * from public.history
order by text, datetime desc;")
.AddEntity(typeof(History))
.List<History>();
它 returns 每个不同 Text
值的最新记录。
我有一个如下所示的数据库实体:
public class History
{
public int Id {get; set;}
public string Text {get; set;}
public DateTime DateTime {get; set;}
}
在 db 中可以有多个具有相同 Text
值的记录,我只需要获取其中的那些记录,它们是每个不同 'Text' 的最新(最新)记录 -所以对于每个 Text
值我应该只得到一个最新记录。
例如 db table 命名历史:
id | text | dateTime
---------------------
1 abc 2018-01-05
2 qqq 2018-01-08
3 abc 2018-01-01
4 qqq 2018-05-05
5 abc 2018-01-03
查询结果应该是这样的:
1 abc 2018-01-05
4 qqq 2018-05-05
现在,我正在使用 nHibernate 这样做:
var historyGroups = _session.Query<History>
.OrderBy(x => x.DateTime)
.GroupBy(x => x.Text)
.ToArray();
然后为每个组选择最后一项 - 但它获取了很多我不需要的数据。
如何以更有效的方式实现这一点,通过 LINQ to SQL 或通过纯 SQL?
您应该在 之前分组 订购:
var historyGroups = _session.Query<History>
.GroupBy(x => x.Text)
.Select(x => new { text = x.Key, latest = x.First(y => y.DateTime == x.Select(z => z.DateTime).Max()) })
.ToArray();
我最终使用了这样的原始 SQL:
var data = _session.CreateSQLQuery("select distinct on (text) * from public.history
order by text, datetime desc;")
.AddEntity(typeof(History))
.List<History>();
它 returns 每个不同 Text
值的最新记录。