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

时间:2013-01-22 17:11:53

标签: c# sql sql-server entity-framework

我有以下场景可以在数据库级别或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

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

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

根据a.id(视图的id字段)

,我需要来自myview的不同记录

由于

2 个答案:

答案 0 :(得分:1)

编辑 - 根据更新,您希望通过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

答案 1 :(得分:1)

即使同一日期有2个重量,以下内容也会给你一条线:

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