2

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

我有一个包含数据、dataTypeID、machineID 和 dateStamp 的中型(2M+ 记录,每天添加 13k)表。我想在 4 小时内从所有机器和特定数据类型中获取数据的平均值、最小值和最大值,回溯 28 天。

例如

DateTime Avg Min Max
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

1 回答 1

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列上添加索引。鉴于您只选择了可能很小的日期范围,使用索引应该是一个显着的优势。我希望查询计划对第一个日期进行索引查找,使其更快。

于 2010-02-18T18:59:52.313 回答