如何根据每天的最大日期时间值筛选数据

本文关键字:时间 日期 筛选 数据 何根 每天 | 更新日期: 2023-09-27 18:18:53

例如:

 ID Name Age Salary ClicksAsofToday  Timestamp

 1. Arun  25 25000    5               Aug,20 10.50pm
 2. Arun  25 2000     8               Aug,20 10.55pm
 3. Arun  25 25000    13              Aug,20 11.00pm
 4. Vijay 25 20000    2               Aug,20 10.50pm
 5. Vijay 25 20000    3               Aug,20 10.55pm
 6. Vijay 25 20000    8               Aug,20 11.00pm
 7. Vijay 25 20000    3               Aug,21 10.55pm
 8. Vijay 25 20000    8               Aug,21 12.00pm

我希望结果为

 ID Name Age Salary  ClicksAsofToday  Timestamp

 1. Arun  25 25000    13              Aug,20 11.00pm (Max time of that Particular date)
 2. Vijay 25 20000    8               Aug,20 11.00pm
 8. Vijay 25 20000    8               Aug,21 12.00pm (Max time of another date)

时间戳列的类型为 DateTime

如何根据每天的最大日期时间值筛选数据

数据如下:

public class Data
{
    public String Name
    {
        get;
        set;
    }
    public DateTime TimeStamp
    {
        get;
        set;
    }
    public Data(String name, DateTime timeStamp)
    {
        this.Name = name;
        this.TimeStamp = timeStamp;
    }
    public override string ToString()
    {
        return String.Format("{0} at {1}", this.Name, this.TimeStamp);
    }
}

您可以使用:

var source = new Data[]
{
    new Data("Yesterday early", DateTime.Today.AddDays(-1)),
    new Data("Yesterday middle", DateTime.Today.AddDays(-1).AddHours(2)),
    new Data("Yesterday middle", DateTime.Today.AddDays(-1).AddHours(2)),
    new Data("Yesterday late", DateTime.Today.AddDays(-1).AddHours(3)),
    new Data("Today early", DateTime.Today),
    new Data("Today middle", DateTime.Today.AddHours(2)),
    new Data("Today late 1", DateTime.Today.AddHours(3)),
    new Data("Today late 2", DateTime.Today.AddHours(3)),
    new Data("Tomorrow early", DateTime.Today.AddDays(1)),
    new Data("Tomorrow middle", DateTime.Today.AddDays(1).AddHours(2)),
    new Data("Tomorrow late 1", DateTime.Today.AddDays(1).AddHours(3)),
    new Data("Tomorrow late 2", DateTime.Today.AddDays(1).AddHours(3)),
};

var lateInDays = source.
    GroupBy((data) => data.TimeStamp.Date).
    Select(dayGroup =>
        new 
        {
            DayGroup = dayGroup, 
            MaxTimeInDay = dayGroup.Max(data => data.TimeStamp)
        }).
    SelectMany((dayGroupWithMaxTime) =>
        dayGroupWithMaxTime.
            DayGroup.
            Where(data =>
                (data.TimeStamp == dayGroupWithMaxTime.MaxTimeInDay)));

这远非最佳,但它有效。

工作原理:

1. GroupBy((data) => data.TimeStamp.Date). - 按日期对数据项进行分组(三天有三组(

2. 部分:

 Select(dayGroup =>
        new 
        {
            DayGroup = dayGroup, 
            MaxTimeInDay = dayGroup.Max(data => data.TimeStamp)
        }).
使用

有关一天中最大时间的信息增强三个按天组中的每个组(实际上使用完整的日期时间,因此您可能希望使用 DateTime.TimeOfDay 属性而不是完整的日期时间(

3. 零件

 SelectMany((dayGroupWithMaxTime) =>
        dayGroupWithMaxTime.
            DayGroup.
            Where(data =>
                (data.TimeStamp == dayGroupWithMaxTime.MaxTimeInDay)));

从每个组(每天(中选择一天中具有最大时间的所有记录,只需简单地将每条记录的时间戳与最大天数(对于他的当前组(天((进行比较:

 dayGroupWithMaxTime.
     DayGroup.
     Where(data =>
               (data.TimeStamp == dayGroupWithMaxTime.MaxTimeInDay))