sql server的聚合问题

我想用sql server语言实现聚合 但是对于雨量的日统计通常是前一日21时到次日20日求和,能否有办法实现日数据的计算
下表是数据格式
ID SID TT BA
1 S1 2018/1/30 12:00 5
2 S1 2018/1/30 13:00 5
3 S1 2018/1/30 14:00 0
4 S1 2018/1/30 15:00 0
5 S1 2018/1/30 16:00 0
6 S1 2018/1/30 17:00 0
7 S1 2018/1/30 18:00 0
8 S1 2018/1/30 19:00 0
9 S1 2018/1/30 20:00 0
10 S1 2018/1/30 21:00 0
11 S1 2018/1/30 22:00 0
12 S1 2018/1/30 23:00 0
13 S1 2018/1/31 0:00 0
14 S1 2018/1/31 1:00 5
15 S1 2018/1/31 2:00 0
16 S1 2018/1/31 3:00 0
17 S1 2018/1/31 4:00 0
18 S1 2018/1/31 5:00 0
19 S1 2018/1/31 6:00 0
20 S1 2018/1/31 7:00 0
21 S1 2018/1/31 8:00 0
22 S1 2018/1/31 9:00 0
23 S1 2018/1/31 10:00 0
24 S1 2018/1/31 11:00 0
25 S1 2018/1/31 12:00 0
26 S1 2018/1/31 13:00 0
27 S1 2018/1/31 14:00 0
28 S1 2018/1/31 15:00 0
29 S1 2018/1/31 16:00 0
30 S1 2018/1/31 17:00 0
31 S1 2018/1/31 18:00 0
32 S1 2018/1/31 19:00 0
33 S1 2018/1/31 20:00 0
34 S1 2018/1/31 21:00 0
35 S1 2018/1/31 22:00 0
36 S1 2018/1/31 23:00 0
下表是想要实现的查询
ID SID TT BA
1 S1 2018/1/30 10
2 S1 2018/1/31 0
3 S1 2018/2/1 0

试试这个,Table 换成你的表名:

SELECT ROW_NUMBER() ID, SID, TT, SUM(BA) AS BA
FROM (
    SELECT SID, CAST(DATEADD(HOUR, 3, TT) AS DATE) AS TT,  BA
    FROM Table
)
GROUP BY SID, TT
ORDER BY SID, TT

把日期时间都+3小时,再转换成日期,成为雨量统计日,然后按日期分组统计。

老哥。
可以试试使用SQL Server中的日期函数实现这个需求。具体SQL语句如下:

sql
SELECT 
    SID, 
    CONVERT(date, TT, 23) AS DT, 
    SUM(BA) AS BA 
FROM YourTable
GROUP BY 
    SID, 
    CONVERT(date, TT, 23) 
HAVING 
    SUM(BA) > 0
    AND CONVERT(time, TT, 8) >= '21:00'
    AND CONVERT(time, TT, 8) < '20:00'
    OR MIN(CONVERT(time, TT, 8)) < '20:00'
ORDER BY 
    SID, 
    DT

解释如下:1. 使用CONVERT(date, TT, 23)将TT列(存放日期时间字符串)转换为日期,以提取日期部分。2. 使用GROUP BY进行分组,按SID和转换后的日期DT分组。3. 使用SUM()对BA列求和,得到每组的雨量累计值。4. 使用HAVING进行过滤,只保留SUM(BA) > 0的组,即有雨量的日期。5. HAVING里使用CONVERT(time, TT, 8) >= '21:00' AND CONVERT(time, TT, 8) < '20:00'过滤21:00之后到次日20:00之前的记录。6. 使用OR MIN(CONVERT(time, TT, 8)) < '20:00'保留跨天的记录,即当天有记录小于20:00的组。7. 最后使用ORDER BY SID, DT排序,以显示结果。运行该SQL语句,可以得到和您期望的一样的结果。这实现了按日统计雨量,并考虑了跨天的情况。