簡體   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