sql / linq to entities:group on hours of hours

时间:2009-11-04 13:27:32

标签: sql sql-server entity-framework

我有一张雪数据表,我每小时都会收到这些数据。 所以例如在凌晨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也可以。

米歇尔

2 个答案:

答案 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.)