これは、私の最初の実際の LINQ-to-SQL クエリです。大きな明らかな間違いを犯しているのではないかと思っていました。
データ、dataTypeID、machineID、dateStamp を含む中規模 (2M 以上のレコード、1 日に 13k を追加) のテーブルがあります。28 日間さかのぼって、4 時間以内にすべてのマシンと特定のデータ型のデータの平均、最小、最大を取得したいと考えています。
例えば
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
など.
1/28/10 午前 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)
};