仅为每组记录选择最近的记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅为每组记录选择最近的记录相关的知识,希望对你有一定的参考价值。

我有一个db实体,如下所示:

public class History
{
    public int Id {get; set;}
    public string Text {get; set;}
    public DateTime DateTime {get; set;}
}

在db中可以有多个具有相同Text值的记录,我只需要获取它们中的那些,这是每个不同的'Text'的最新(最新) - 所以对于每个Text值我应该只得到一个最新记录。

例如db table named history:

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

它返回每个不同的Text值的最新记录。

以上是关于仅为每组记录选择最近的记录的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]

MySQL按顺序查找每组最近/最大的记录

如何仅为以前记录中未选择为 MIN 的值选择 MIN?

为每组选择随机行

为每组 pyspark RDD/dataframe 选择随机列

从每组 sqlite 中选择前 n 条记录