繁体   English   中英

每组记录仅选择最新记录

[英]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值,我应该只获取一个最新记录。

例如,名为历史记录的数据库表:

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值返回最新记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM