根据一列获取不同的行,并按日期排序
本文关键字:排序 日期 获取 一列 | 更新日期: 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