根据一列获取不同的行,并按日期排序

本文关键字:排序 日期 获取 一列 | 更新日期: 2023-09-27 17:55:04

我有以下场景,可以在数据库级别或Linq到EF级别上解决:下面是我在数据库中的视图:

id  title   date           weight
==================================
1   t1     2013-01-18       1.5
1   t1     2013-01-17       1.4
1   t1     2013-01-15       1.31
1   t1     2013-01-12       1.22
2   t2     2013-01-19       2.3
2   t2     2013-01-16       2.1
2   t2     2013-01-07       1.81
2   t2     2013-01-19       1.62

我需要的结果是每个项目(t1和t2)的一个记录,这是最新的一个日期。

那么输出将像这样:

id  title   date           weight
==================================
1   t1     2013-01-18       1.5
2   t2     2013-01-19       2.3

正如我上面所说的,在数据库级或linq级使用(Distinct)的答案都是受欢迎的。

c# linq:

mylist = (from a in db.myview
join art in db.viewTags on a.id equals art.ArticleID
where (art.TagID == tag.ID)
select a).Distinct().Take(10).ToList();

我需要不同的记录从myview根据a.id (id字段的视图)

谢谢

根据一列获取不同的行,并按日期排序

EDIT -根据更新需要区分id

全文:DistinctBy in Linq (Find Distinct object by Property)

以下是MoreLINQ库的一部分。

使用DistinctBy函数

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

因此,要使用Id属性找到不同的值,您可以使用:

mylist = (from a in db.myview
 join art in db.viewTags on a.id equals art.ArticleID
 where (art.TagID == tag.ID)
 select a).DistinctBy(a=>a.Id).Take(10).ToList();

select * from table 
inner join
(select max(date) as date,id from table group by id) d 
on d.id = table.id and d.date= table.date

即使有两个相同日期的重量,下面的代码也会给你一行:

declare @t table (
    id int,
    title varchar(50),
    date datetime,
    weight decimal(19,4)
)
insert into @t (id, title, date, weight) values
   (1, 't1', '20130118', 1.5),
   (1, 't1', '20130118', 1.6),
   (2, 't2', '20130116', 1.4),
   (2, 't2', '20130115', 1.2)
select
    *
from
    (
        select ROW_NUMBER() over (partition by id order by date desc) rn, * 
        from @t
    ) v
where rn = 1