加报雨量进行累计排序


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:459: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。为了获取这个时间,我们可以使用DATEADDDATEDIFF函数。然后,我们可以使用 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分钟内的雨量数据。然后,这个查询会根据这个最新的累计雨量进行排序。