我有一张雪数据表,我每小时都会收到这些数据。 所以例如在凌晨0点到凌晨1点之间,1厘米的雪会下降,凌晨1点到凌晨2点之间3厘米的雪会下降,凌晨2点到凌晨3点之间0厘米的积雪会下降,凌晨3点到凌晨4点之间2厘米的积雪会下降等等 所以该表有一个Snowdate列(datetime),一个Snowdate小时列(int)和一个降雪列(int) 现在我想呈现按小组分组的数据:6小时(0-5,6-11,12-17和18-23),所以在早上0点到早上6点之间我有6条记录(1cm,3c,0cm, 2厘米,2厘米,0厘米)我想显示一行8号,依此类推剩下的一天。 每天每小时都会在数据库中有一条记录,所以每天总共有24条记录
纯sql解决方案可以(视图左右)或实体的linq也可以。
米歇尔
答案 0 :(得分:3)
按小时/ 6分组(使用整数运算)并选择对金额列进行分组。选择一个新对象,Key * 6和Sum()得到的分组为该“小时”的总数。 “小时”将是每个范围内的第一个小时。
var query = db.SnowRecords.GroupBy( s => s.SnowHour / 6, a => a.SnowFall )
.Select( g => new {
Hour = g.Key * 6,
Amount = g.Sum()
});
您没有说是否需要按日期分组,但如果这样做,那么这将成为按日期分组的记录的内部查询。
var query = db.SnowRecords.GroupBy( s => s.SnowDate.Date )
.Select( g => new {
Date = g.Key,
HourlySnowFall = g.GroupBy( s => s.SnowHour / 6, a => a.SnowFall )
.Select( sg => new {
Hour = sg.Key * 6,
Amount = sg.Sum()
})
});
答案 1 :(得分:1)
如果我理解正确,请尝试这样的事情
DECLARE @Table TABLE(
SnowDate DATETIME,
SnowHour INT,
SnowFall INT
)
INSERT INTO @Table (SnowDate,SnowHour,SnowFall) SELECT '10 Sep 2009', 0, 1
INSERT INTO @Table (SnowDate,SnowHour,SnowFall) SELECT '10 Sep 2009', 1, 3
INSERT INTO @Table (SnowDate,SnowHour,SnowFall) SELECT '10 Sep 2009', 2, 0
INSERT INTO @Table (SnowDate,SnowHour,SnowFall) SELECT '10 Sep 2009', 3, 2
INSERT INTO @Table (SnowDate,SnowHour,SnowFall) SELECT '10 Sep 2009', 4, 2
INSERT INTO @Table (SnowDate,SnowHour,SnowFall) SELECT '10 Sep 2009', 5, 0
INSERT INTO @Table (SnowDate,SnowHour,SnowFall) SELECT '10 Sep 2009', 6, 10
INSERT INTO @Table (SnowDate,SnowHour,SnowFall) SELECT '10 Sep 2009', 7, 10
SELECT SnowDate,
CAST(FLOOR((SnowHour) / 6.) * 6 AS VARCHAR(4)) + ' TO ' + CAST((FLOOR((SnowHour) / 6.) + 1) * 6 - 1 AS VARCHAR(4)),
SUM(SnowFall) AS Total
FROM @Table
GROUP BY SnowDate,
FLOOR((SnowHour) / 6.)