select top 60 r.STCD,b.STNM,sum(r.DRP) as DRP_SUM ,b.RVNM,b.ADMAUTH ,b.STLC from dbo.ST_PPTN_R r left join dbo.ST_STBPRP_B b on r.STCD=b.STCD where r.TM >= DATEADD(hour,-2,GETDATE()) and b.FRGRD <> 5 group by r.STCD,b.RVNM ,b.STNM,b.STLC,b.ADMAUTH order by sum(r.DRP) desc
这是写的整点两小时雨量排序的sql语句,譬如7点整到9点整这一整个时段的累计雨量排序。但是现在我需要对加报雨量进行累计排序,比如现在是9点55,我需要从9点5分到9点55的雨量进行累计排序,数据库里的雨量数据是5分钟一刷新,字段都不变,雨量字段还是DRP_SUM
或者换个说法,我是需要最新时段以后的雨量累计排序,现在是9点半,我是需要9点之后到9点半的雨量累计;现在是9点35,那我就是需要9点之后到9点35的雨量累计
SELECT TOP 60
r.STCD,
b.STNM,
SUM(r.DRP) AS DRP_SUM,
b.RVNM,
b.ADMAUTH,
b.STLC
FROM
dbo.ST_PPTN_R r
LEFT JOIN dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE
r.TM >= DATEADD(minute, -50, GETDATE()) -- 修改时间范围,此处为当前时间减去50分钟
AND r.TM <= GETDATE() -- 修改时间范围,此处为当前时间
AND b.FRGRD <> 5
GROUP BY
r.STCD,
b.RVNM,
b.STNM,
b.STLC,
b.ADMAUTH
ORDER BY
SUM(r.DRP) DESC;
希望采纳
SELECT TOP 60
r.STCD,
b.STNM,
SUM(r.DRP) AS DRP_SUM,
b.RVNM,
b.ADMAUTH,
b.STLC
FROM
dbo.ST_PPTN_R r
LEFT JOIN
dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE
r.TM >= DATEADD(hour, -2, GETDATE()) -- 选择整点两小时内的数据
AND r.TM >= DATEADD(minute, -50, GETDATE()) -- 选择最新时段之后的数据,比如当前时间为 9:35,则选择从 8:45 到 9:35 的数据
AND b.FRGRD <> 5
GROUP BY
r.STCD,
b.RVNM,
b.STNM,
b.STLC,
b.ADMAUTH
ORDER BY
SUM(r.DRP) DESC;
select top 60 r.STCD
,b.STNM
,b.RVNM
,b.ADMAUTH
,b.STLC
,DATE_FORMAT(r.TM, '%Y-%m-%d %H') as sdate -- 用这里控制上报时间的统计周期就好了
,sum(r.DRP) as DRP_SUM
from dbo.ST_PPTN_R r
left join dbo.ST_STBPRP_B b on r.STCD=b.STCD
where b.FRGRD <> 5
group by r.STCD,b.RVNM ,b.STNM,b.STLC,b.ADMAUTH ,DATE_FORMAT(r.TM, '%Y-%m-%d %H')
order by sum(r.DRP) desc
整点到当前时间段分钟数的数据吧,试着写了下,没有表,没法测试,你试试
SELECT
top 60 r.STCD,
b.STNM,
sum( r.DRP ) AS DRP_SUM,
b.RVNM,
b.ADMAUTH,
b.STLC
FROM
dbo.ST_PPTN_R r
LEFT JOIN dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE
r.TM >= dateadd (
MINUTE,- datediff(
MINUTE,
CASE
WHEN datepart ( MINUTE, getdate ( ) ) = 0 THEN
getdate ( ) ELSE dateadd ( HOUR,- 1, dateadd ( MINUTE,- datepart ( MINUTE, getdate ( ) ), getdate ( ) ) )
END,
getdate ( )
),
getdate ( )
)
AND b.FRGRD <> 5
GROUP BY
r.STCD,
b.RVNM,
b.STNM,
b.STLC,
b.ADMAUTH
ORDER BY
sum( r.DRP ) DESC
你的需求还挺特殊的第一次见到,一般都是求整点前后的雨量记录,向你回答我是一个小白的答案时,这是可以做到的,现在是9点35,那我就是需要9点之后到9点35的雨量累计这句话就没办法实现,因为你的时间还是变动的,结果完全取决你where筛选器怎么写限定
CREATE PROCEDURE LatestRainfall
AS
BEGIN
DECLARE @CurrentHour DATETIME;
SET @CurrentHour = DATEADD(HOUR, DATEDIFF(HOUR, 0, GETDATE()), 0);
SELECT TOP 60 r.STCD, b.STNM, SUM(r.DRP) AS DRP_SUM, b.RVNM, b.ADMAUTH, b.STLC
FROM dbo.ST_PPTN_R r
LEFT JOIN dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE r.TM >= @CurrentHour AND r.TM < DATEADD(HOUR, 1, @CurrentHour) AND b.FRGRD <> 5
GROUP BY r.STCD, b.RVNM, b.STNM, b.STLC, b.ADMAUTH
ORDER BY SUM(r.DRP) DESC;
END
SELECT TOP 60 r.STCD, b.STNM, SUM(r.DRP) AS DRP_SUM, b.RVNM, b.ADMAUTH, b.STLC
FROM dbo.ST_PPTN_R r
LEFT JOIN dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE r.TM >= DATEADD(MINUTE, -55, CONVERT(DATETIME, CONVERT(DATE, GETDATE())) -- 最新时段以后的时间范围
AND r.TM < DATEADD(HOUR, 1, CONVERT(DATETIME, CONVERT(DATE, GETDATE())))
AND r.TM >= DATEADD(MINUTE, -5, GETDATE()) -- 指定时间段内的数据
AND b.FRGRD <> 5
GROUP BY r.STCD, b.RVNM, b.STNM, b.STLC, b.ADMAUTH
ORDER BY SUM(r.DRP) DESC
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
那如果现在正好9点或9点过3分呢,是8点过5分到9点的数据排序吗?
这个就截取日期time到整点,比如time是13点15,截全完整点后
time in 【13,13 + 1】
在后端代码中动态更新拼接sql,这样容易实现些
分组统计,然后排序
采用chatgpt:
要对指定时间范围内的降雨量数据进行累积排序,可以修改 SQL 查询以仅考虑指定时间之后的数据。 您可以使用 WHERE 子句根据所需的时间范围过滤记录。 下面是用于实现此目的的更新的 SQL 查询:
DECLARE @StartTime DATETIME = '2023-08-01 09:00:00'; -- Replace this with the desired start time
SELECT TOP 60
r.STCD,
b.STNM,
SUM(r.DRP) AS DRP_SUM,
b.RVNM,
b.ADMAUTH,
b.STLC
FROM
dbo.ST_PPTN_R r
LEFT JOIN
dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE
r.TM >= @StartTime
AND b.FRGRD <> 5
GROUP BY
r.STCD,
b.RVNM,
b.STNM,
b.STLC,
b.ADMAUTH
ORDER BY
SUM(r.DRP) DESC;
在此查询中,我添加了一个变量 @StartTime 来指定所需的开始时间。 您可以将@StartTime的值替换为您想要的实际开始时间。 然后,查询将仅考虑该时间之后的记录,并根据该时间范围内的降雨量数据计算累积和。
例如,如果@StartTime为“2023-08-01 09:35:00”,则查询将考虑从上午9:35到当前时间的数据,并对该时间范围内的降雨量数据进行累积排序。
援引GPT回答:
要实现最新时段以后的雨量累计排序,你可以修改原始的SQL语句如下:
DECLARE @endTime DATETIME = GETDATE(); -- 设置最新时段的结束时间
DECLARE @startTime DATETIME = DATEADD(MINUTE, -30, @endTime); -- 计算最新时段的开始时间
SELECT TOP 60 r.STCD, b.STNM, SUM(r.DRP) AS DRP_SUM, b.RVNM, b.ADMAUTH, b.STLC
FROM dbo.ST_PPTN_R r
LEFT JOIN dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE r.TM >= @startTime AND r.TM <= @endTime AND b.FRGRD <> 5
GROUP BY r.STCD, b.RVNM, b.STNM, b.STLC, b.ADMAUTH
ORDER BY SUM(r.DRP) DESC
这里将原始SQL中的时间范围改为最新时段的开始时间和结束时间,即从@startTime
到@endTime
,然后再执行累计排序。请注意,@endTime
和@startTime
需要根据实际情况进行调整。
你需要在特定时间段内对雨量进行累计排序,然后再按照这个排序进行查询。
SQL查询语句:
我们需要将查询的起始时间改为当前小时的开始,比如说现在是9:35,那么我们需要的起始时间就是9:00。为了获取这个时间,我们可以使用DATEADD
和DATEDIFF
函数。然后,我们可以使用 GETDATE()
函数获取当前时间作为结束时间。
select top 60 r.STCD,b.STNM,sum(r.DRP) as DRP_SUM ,b.RVNM,b.ADMAUTH ,b.STLC
from dbo.ST_PPTN_R r
left join dbo.ST_STBPRP_B b on r.STCD=b.STCD
where r.TM >= DATEADD(hour, DATEDIFF(hour, 0, GETDATE()), 0)
and r.TM <= GETDATE()
and b.FRGRD <> 5
group by r.STCD,b.RVNM ,b.STNM,b.STLC,b.ADMAUTH
order by sum(r.DRP) desc
上述SQL语句将会在当前小时开始到现在的时间段内进行雨量的累计和排序。
注意:你应该确保你的数据库支持上述SQL语句中的所有函数和操作。以上SQL语句适用于SQL Server数据库。如果你正在使用其他类型的数据库,你可能需要对语句进行一些调整。
为了实现这个需求,你需要根据当前的时间来计算对应的时段,然后对每个时段进行排序。可以写一个存储过程来实现:
DECLARE @CurrentTime DATETIME;
SET @CurrentTime = GETDATE();
SELECT TOP 60
r.STCD,
b.STNM,
SUM(r.DRP) AS DRP_SUM,
b.RVNM,
b.ADMAUTH,
b.STLC
FROM dbo.ST_PPTN_R r
LEFT JOIN dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE r.TM >= DATEADD(hour, -2, GETDATE()) -- 这里修改为当前时间减去两小时
AND b.FRGRD <> 5
GROUP BY r.STCD, b.RVNM, b.STNM, b.STLC, b.ADMAUTH
HAVING DATEDIFF(MINUTE, GETDATE(), @CurrentTime) >= 0 -- 计算当前时间与当前时间段的间隔,确保只选择当前时间段的数据
ORDER BY SUM(r.DRP) DESC;
要实现最新时段以后的雨量累计排序,你可以修改SQL语句中的时间条件。以下是修改后的SQL语句示例:
SELECT TOP 60 r.STCD, b.STNM, SUM(r.DRP) AS DRP_SUM, b.RVNM, b.ADMAUTH, b.STLC
FROM dbo.ST_PPTN_R r
LEFT JOIN dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE r.TM >= DATEADD(minute, -55, GETDATE()) -- 修改时间条件,获取最新时段以后的数据
AND r.TM <= GETDATE() -- 获取当前时间之前的数据
AND b.FRGRD <> 5
GROUP BY r.STCD, b.RVNM, b.STNM, b.STLC, b.ADMAUTH
ORDER BY SUM(r.DRP) DESC
在上述示例中,我使用了DATEADD
函数将时间条件修改为最新时段以后的数据。DATEADD(minute, -55, GETDATE())
表示获取当前时间的55分钟前的时间,即最新时段的起始时间。然后,我添加了一个额外的条件r.TM <= GETDATE()
,以确保只获取当前时间之前的数据。
请注意,这只是一个示例,你可能需要根据你的数据库结构和需求进行适当的调整。
参考newbing
为了实现这个需求,你需要使用一个滑动窗口(sliding window)的概念。这个窗口会根据当前时间滑动,以收集最新的雨量数据。以下是一个可能的SQL查询,假设你的数据表为ST_PPTN_R和ST_STBPRP_B,并且数据时间字段为TM,雨量字段为DRP:
SELECT
r.STCD,
b.STNM,
SUM(r.DRP) OVER (
ORDER BY r.TM
RANGE BETWEEN INTERVAL '5 Minutes' PRECEDING AND CURRENT ROW
) AS DRP_SUM,
b.RVNM,
b.ADMAUTH,
b.STLC
FROM
dbo.ST_PPTN_R r
LEFT JOIN
dbo.ST_STBPRP_B b ON r.STCD = b.STCD
WHERE
r.TM >= DATEADD(hour, -2, GETDATE())
GROUP BY
r.STCD,
b.RVNM,
b.STNM,
b.STLC,
b.ADMAUTH
ORDER BY
SUM(r.DRP) OVER (
ORDER BY r.TM
RANGE BETWEEN INTERVAL '5 Minutes' PRECEDING AND CURRENT ROW
) DESC;
在这个查询中,SUM(r.DRP) OVER (ORDER BY r.TM RANGE BETWEEN INTERVAL '5 Minutes' PRECEDING AND CURRENT ROW)部分使用了一个窗口函数,该函数会对每一行应用一个聚合函数(这里是求和),而这个聚合函数的应用范围是当前行及其前5分钟的数据。因此,每一行的结果都是基于当前时间点过去的5分钟内的雨量数据。然后,这个查询会根据这个最新的累计雨量进行排序。