这是我的第一个真实的LINQ-to-SQL查询。我想知道我是否犯了任何大而明显的错误。
我有一个中大型(2M +记录,每天增加13k)表,包含data,dataTypeID,machineID和dateStamp。我希望在4小时内获得所有机器和特定数据类型的平均,最小和最大数据,并返回28天。
E.g
日期时间平均最小最大
1/1/10 12:00 AM 74.2 72.1 75.7
1/1/10 04:00 AM 74.5 73.1 76.2
1/1/10 08:00 AM 73.7 71.5 74.2
1/1/10 12:00 PM 73.2 71.2 76.1
等等。
1/28/10 12:00 AM 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)
};
答案 0 :(得分:3)
如果你想要4小时的增量,则将小时除以4(使用整数除法),然后在创建新的datetime元素时乘以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
列上添加索引。鉴于您只选择了一小部分日期,使用索引应该是一个重要的优势。我希望查询计划能够为第一个日期执行索引搜索,使其更快。