【问题标题】:Get MAX date per day and return all rows with those dates每天获取 MAX 日期并返回具有这些日期的所有行
【发布时间】:2016-08-08 02:22:57
【问题描述】:

我有一个包含日期时间字段的表。有多行包含不同的,有时是相同的日期。

我正在尝试找到一个 LINQ 查询,它可以向我返回过去 n 天内所有条目的 IList,但是对于返回的每一天的行,我应该只看到来自MAX 时间。

例如如果我一天中有 16 年 4 月 4 日 1:00:00 和 16 年 4 月 4 日 2:00:00 的行,我希望检索后一个日期的所有行。

补充说明:

实体有一个属性,比如说类别。我希望查询返回一个 IList,其中填充了按最大日期 PER DAY 和 PER CATEGORY 排序的每个实体。例如

Item1 | Category1 | 10/10/2016 11:00:00
Item1 | Category1 | 10/10/2016 11:00:00
Item1 | Category1 | 10/10/2016 11:00:00
Item1 | Category2 | 10/10/2016 11:00:05
Item1 | Category1 | 10/10/2016 11:00:05
Item1 | Category1 | 10/10/2016 11:00:05
Item1 | Category2 | 10/11/2016 11:00:00
Item1 | Category1 | 10/11/2016 11:00:00

我希望结果看起来像一个列表:

Item1 | Category2 | 10/10/2016 11:00:05
Item1 | Category1 | 10/10/2016 11:00:05
Item1 | Category1 | 10/10/2016 11:00:05
Item1 | Category2 | 10/11/2016 11:00:00
Item1 | Category1 | 10/11/2016 11:00:00

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:
    var n = new DateTime(2016, 10, 10);
    var res = from data in list
              where data.Date >= n
              group data by new { data.Date.Year, data.Date.Month, data.Date.Day }
              into dataGroup
              select dataGroup.OrderBy(eg => eg.Date).Last();
    

    这是一个小例子:

    class Data 
    {
        public string Name { get; set; }
        public DateTime Date { get; set; }
    }
    
    static void Main(string[] args)
    {
        var list = new List<Data> {
            new Data() { Date = new DateTime(2016, 10, 9, 11, 0 , 0) },
            new Data() { Date = new DateTime(2016, 10, 10, 11, 0 , 0) },
            new Data() { Date = new DateTime(2016, 10, 10, 13, 0, 0) },
            new Data() { Date = new DateTime(2016, 11, 10) },
            new Data() { Date = new DateTime(2016, 11, 11, 10, 0, 0) },
            new Data() { Date = new DateTime(2016, 11, 11, 9, 0, 0) },
        };
    
        var n = new DateTime(2016, 10, 10);
    
        var res = from data in list
                    where data.Date >= n
                    group data by new { data.Date.Year, data.Date.Month, data.Date.Day }
                    into dataGroup
                    select dataGroup.OrderBy(eg => eg.Date).Last();
    
        foreach (Data r in res.ToList())
        {
            Console.WriteLine(r.Date);
        }
    
        Console.ReadKey();
    }
    

    输出:

    2016 年 10 月 10 日下午 1:00:00
    2016 年 11 月 10 日上午 12:00:00
    2016 年 11 月 11 日上午 10:00:00

    【讨论】:

    • 我在这里看到的问题是我每天只返回最新的。我希望每天返回多行。例如,我有 100 条记录,其中 50 条记录的日期为 2016 年 10 月 10 日 11:00:00,50 条记录的日期为 2016 年 10 月 10 日 11:00:05。我需要得到 50 的最大日期,然后对此进行扩展以获取我每天的所有记录,但仅限于每天的最大日期
    【解决方案2】:

    我试图找到一个 LINQ 查询,它可以在过去 n 天内向我返回 ALL 条目的 IList,但是对于返回的每一天的行,我应该只看到来自MAX 时间。

    然后你需要过滤最近n天的数据,按日期分组,找到每个日期内的最大时间,选择所有行在最大时间的日期内,最后将结果展平:

    var endTime = DateTime.Today; // uncomment to include today .AddDays(1);
    var startTime = endTime.AddDays(-n);
    var result =
        from e in db.Table
        where e.DateTime >= startTime && e.DateTime < endTime
        group e by e.DateTime.Date into dateGroup
        let maxTime = (from e in dateGroup select e.DateTime).Max()
        from e in dateGroup
        where e.DateTime == maxTime
        select e;
    

    【讨论】:

      【解决方案3】:

      试试这个,假设 n 是一个 int 代表最后 n 天。

                  DateTime sinceLast = DateTime.Now.AddDays(-n);
                  DateTime sinceLastAtMidnight = new DateTime(sinceLast.Year, sinceLast.Month, sinceLast.Day);
      
                  var result =  lstDate.Where(x => x >= sinceLastAtMidnight)
                                       .Select(x => new
                                          { DateActual = x,
                                            DateWitoutTime = new DateTime(x.Year, x.Month, x.Day) 
                                          }) 
                                       .GroupBy(x => x.DateWitoutTime)
                                       .Select(x => x.OrderByDescending(y => y.DateActual).FirstOrDefault())
                                       .Select(x => x.DateActual)
                                       .ToList();
      

      【讨论】:

        猜你喜欢
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多