gpt4 book ai didi

c# - 这个按小时平均和分组的 LINQ 查询是否高效编写?

转载 作者:行者123 更新时间:2023-11-30 22:47:17 26 4
gpt4 key购买 nike

这是我在现实世界中的第一个 LINQ-to-SQL 查询。我想知道我是否犯了任何明显的大错误。

我有一个中大型(超过 200 万条记录,每天增加 13k)表,其中包含数据、dataTypeID、machineID 和 dateStamp。我想在 4 小时内获取所有机器和特定数据类型的数据的平均值、最小值和最大值,并返回 28 天。

例如

日期时间 平均 最小值 最大值
1/1/10 12:00AM 74.2 72.1 75.7
1/1/10 04:00AM 74.5 73.1 76.2
1/1/10 08:00AM 73.7 71.5 74.2
1/1/10 12:00PM 73.2 71.2 76.1
等..
2010 年 1 月 28 日中午 12:00 73.1 71.3 75.5

到目前为止,我只能按 1 小时的增量对平均值进行分组,但如果备选方案过于困惑,我可能会处理这个问题。

代码:

var q =
from d in DataPointTable
where d.dateStamp > DateTime.Now.AddDays(-28) && (d.dataTypeID == (int)dataType + 1)
group d by new {
d.dateStamp.Year,
d.dateStamp.Month,
d.dateStamp.Day,
d.dateStamp.Hour
} into groupedData
orderby groupedData.Key.Year, groupedData.Key.Month, groupedData.Key.Day, groupedData.Key.Hour ascending
select new {
date = Convert.ToDateTime(
groupedData.Key.Year.ToString() + "-" +
groupedData.Key.Month.ToString() + "-" +
groupedData.Key.Day.ToString() + " " +
groupedData.Key.Hour.ToString() + ":00"
),
avg = groupedData.Average(d => d.data),
max = groupedData.Max(d => d.data),
min = groupedData.Min(d => d.data)
};

最佳答案

如果您想要 4 小时的增量,请将小时除以 4(使用整数除法),然后在创建新的日期时间元素时乘以 4。请注意,您可以简单地使用采用年、月、日、小时、分钟和秒的构造函数,而不是构造字符串并将其转换。

var q = 
from d in DataPointTable
where d.dateStamp > DateTime.Now.AddDays(-28) && (d.dataTypeID == (int)dataType + 1)
group d by new {
d.dateStamp.Year,
d.dateStamp.Month,
d.dateStamp.Day,
Hour = d.dateStamp.Hour / 4
} into groupedData
orderby groupedData.Key.Year, groupedData.Key.Month, groupedData.Key.Day, groupedData.Key.Hour ascending
select new {
date = new DateTime(
groupedData.Key.Year,
groupedData.Key.Month,
groupedData.Key.Day,
(groupedData.Key.Hour * 4),
0, 0),
avg = groupedData.Average(d => d.data),
max = groupedData.Max(d => d.data),
min = groupedData.Min(d => d.data)
};

为了提高效率,您可能需要考虑在 dateStamp 列上添加索引。鉴于您只选择了一个可能很小的日期范围,使用索引应该是一个显着的优势。我希望查询计划对第一个日期进行索引查找,使其更快。

关于c# - 这个按小时平均和分组的 LINQ 查询是否高效编写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2291286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com