问一个freesql问题

石岩Maple 2021-05-11 09:32:21
场景:
有个反应天气的表temperature_peak,里面有每年12个月每天的天气情况,每天一行数据,现在要得出每年天气质量最大的那个数据,并获取那个数据对应的时间

在数据库里直接查询的语句我是这么写的,结果是正确的:
select a.max_qty,a.max_qty_time from temperature_peak a inner join (SELECT max_qty_time,max(max_qty) max_qty
FROM temperature_peak
GROUP BY DATE_FORMAT(max_qty_time,'%Y')
ORDER BY max_qty_time asc) b on DATE_FORMAT(a.max_qty_time,'%Y')= DATE_FORMAT(b.max_qty_time,'%Y')
and a.max_qty=b.max_qty

结果是这样的:
Qty Time
...
38.2 2019-08-01 12:06:00
38.2 2020-08-17 15:22:00
26.8 2021-02-22 13:27:00


在freesql里怎么写,目前我是这么写的
var list = _repo.Orm.Select<TemperaturePeak>().NoTracking().OrderByDescending(p => p.Time).GroupBy(p => p.Time.Value.Year).ToList(p => new HistoryPeakResponse { Value = p.Max(p.Value.Qty), Time = p.Value.Time });

但是结果不对,分完组后结果是这样的(分完组后虽然Qty的结果是对的,但是时间却取了每年的头一天):
Qty Time
...
38.2 2019-01-01 12:06:00
38.2 2020-01-01 15:22:00
26.8 2021-01-01 13:27:00

刚写freesql,不太理解怎么写,烦请赐教,最好能直接给代码

...全文
137 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangsl_wsl 2021-05-11
  • 打赏
  • 举报
回复
var list2 = await _repo.Orm.Select<TemperaturePeak> .GroupBy(item=>item.CreateTime.Year) .ToListAsync(p=> new { Qty = p.Max(p.Value.EntityId), Year = p.Key }); var result = new List<TemperaturePeak>(); foreach (var rep in list2) { var item = await _repo.Orm.Select<TemperaturePeak> .Where(e => e.Qty == rep.Qty && e.Time.Year == rep.Year) .ToOneAsync(); result.Add(new TemperaturePeak { Qty = item.EntityId, Time = item.CreateTime }); } result 就是你的结果
wangsl_wsl 2021-05-11
  • 打赏
  • 举报
回复
分两步查询 第一步拿到Qty , 然后通过 Qty 加 年二次查询,数据拼接就可以实现了.

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧