如何筛选多类型间的最大公共日期?SQL与LINQ实现对比咨询
找出所有类型间的最大公共日期:SQL vs LINQ
先直接说结论:如果数据存在数据库里,用SQL实现更简便高效——毕竟数据库天生擅长这类聚合统计;如果数据已经加载到.NET应用的内存集合里,LINQ会更贴合你的代码上下文,不用额外写SQL语句。
先看你给出的示例数据:
| Type | Date |
|---|---|
| 1 | 2018-03-01 |
| 1 | 2018-02-01 |
| 1 | 2018-01-01 |
| 2 | 2018-02-01 |
| 2 | 2018-05-01 |
| 2 | 2018-01-01 |
| 3 | 2018-01-01 |
| 3 | 2018-03-01 |
| 3 | 2018-02-01 |
目标是找到所有Type都存在的最大日期,这里结果是2018-02-01。
SQL实现思路与代码
核心思路:先统计总共有多少种不同的Type,然后找出每个日期对应的不同Type数量,筛选出数量等于总Type数的日期,再取最大的那个。如果没有这样的日期,结果会是空。
-- 先统计总Type数,再筛选符合条件的最大日期 WITH TotalTypes AS ( SELECT COUNT(DISTINCT Type) AS Count FROM YourTableName ) SELECT MAX(Date) AS MaxCommonDate FROM YourTableName GROUP BY Date HAVING COUNT(DISTINCT Type) = (SELECT Count FROM TotalTypes)
如果没有公共日期,这个查询会返回NULL,完全符合需求。
LINQ实现思路与代码
假设你已经把数据加载到了一个List<YourDataModel>里,模型定义大概是:
public class YourDataModel { public int Type { get; set; } public DateTime Date { get; set; } }
LINQ的思路和SQL一致:先算总Type数,然后按Date分组,统计每组的不同Type数量,筛选出匹配总Type数的组,最后取最大的Date。
var data = new List<YourDataModel> { // 填充示例数据 new YourDataModel { Type = 1, Date = DateTime.Parse("2018-03-01") }, new YourDataModel { Type = 1, Date = DateTime.Parse("2018-02-01") }, new YourDataModel { Type = 1, Date = DateTime.Parse("2018-01-01") }, new YourDataModel { Type = 2, Date = DateTime.Parse("2018-02-01") }, new YourDataModel { Type = 2, Date = DateTime.Parse("2018-05-01") }, new YourDataModel { Type = 2, Date = DateTime.Parse("2018-01-01") }, new YourDataModel { Type = 3, Date = DateTime.Parse("2018-01-01") }, new YourDataModel { Type = 3, Date = DateTime.Parse("2018-03-01") }, new YourDataModel { Type = 3, Date = DateTime.Parse("2018-02-01") } }; int totalTypes = data.Select(x => x.Type).Distinct().Count(); // 处理无公共日期时返回null的情况 var maxCommonDate = data .GroupBy(x => x.Date) .Where(g => g.Select(x => x.Type).Distinct().Count() == totalTypes) .Select(g => (DateTime?)g.Key) .DefaultIfEmpty() .Max(); // 输出结果:2018-02-01 00:00:00(无公共日期时输出null) Console.WriteLine(maxCommonDate);
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

