You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

燃气启停日期数据处理:获取指定区间最小启停日期

燃气供应启停日期查询需求及SQL优化求助

需求说明

  • 从存储燃气供应开启/关闭日期的表中,需获取两类日期:
    1. 最近一次开启日期与前一次开启日期之间的最小关闭日期
    2. 最近一次关闭日期与前一次关闭日期之间的最小开启日期
  • 需忽略启停日期相同的记录

示例说明

  • 示例1:返回关闭日期02/11/2015,开启日期23/12/2015
  • 示例2:忽略最后两条同日期记录,返回关闭日期28/07/2021,开启日期22/11/2021
  • 示例3:返回初始开启日期13/08/2007,关闭日期26/06/2023
  • 示例4:返回关闭日期24/03/2011,开启日期11/04/2011

所有数据存储在同一张表中,各示例对应不同ID。

现有SQL代码

IF OBJECT_ID('TEMPDB.dbo.##tempROWS') IS NOT NULL DROP TABLE  ##tempROWS
SELECT ROW_NUMBER() OVER (ORDER BY ID)
ROW_NUM, ID, Date, Status
INTO ##TEMPROWS
FROM ##tempunion  ---the main table

CREATE TABLE ##temptablefin  (
[RId]        int ,
[ID]   nvarchar(9),
    [Date]  datetime,
[Status]   nvarchar(12),
    [MAXOFFDATE] datetime NULL,
    [MAXONDATE] datetime NULL,
    [MinRowNo] int
)

INSERT INTO ##temptablefin
SELECT 
ROW_NUM AS RID, 
ID, Date, Status
, '01/01/1990' AS MAXOFFDATE
, '01/01/1990' AS MAXONDATE
NULL AS MinRowNo

FROM ##TEMPROWS

IF OBJECT_ID('TEMPDB.dbo.##mincount') IS NOT NULL DROP TABLE  ##mincount;
Select MIN(Id) AS MINCount, ID , Status
INTO ##mincount 
FROM  ##temptablefin  GROUP BY ID, Status

UPDATE ##temptablefin 
SET MinRowNo = (SELECT MINCount FROM ##mincount mm WHERE mm.ID = ##temptablefin.ID and mm.Status =  ##temptablefin.Status)

select cc.ID, cc.Rid, cc.CertDate, cc.Status, cc.MAXOFFDATE, cc.MAXONDATE, cc.MinRowNo
,CASE WHEN cc.Status = 'ON' AND ff.Status = 'ON' THEN cc.Date ELSE ff.Date END AS ffs
,CASE WHEN cc.Status = 'CAPPED OFF' AND ff.Status = 'OFF' THEN cc.Date ELSE ff.Date END AS ffS2
,ff.Nid,ff.ID, ff.Date, ff.Status

from ##temptablefin cc
INNER JOIN (SELECT CASE WHEN (id) = MinRowNo THEN (id) Else (Rid+1) END AS Nid, ID, Status, CDate FROM ##temptablefin) ff
ON CC.RId = ff.Nid and cc.ID = ff.ID

ORDER BY cc.ID, cc.RId

寻求技术帮助完成上述需求。

内容的提问来源于stack exchange,提问作者Deb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:56:59