燃气启停日期数据处理:获取指定区间最小启停日期
燃气供应启停日期查询需求及SQL优化求助
需求说明
- 从存储燃气供应开启/关闭日期的表中,需获取两类日期:
- 最近一次开启日期与前一次开启日期之间的最小关闭日期
- 最近一次关闭日期与前一次关闭日期之间的最小开启日期
- 需忽略启停日期相同的记录
示例说明
- 示例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
相关产品推荐
相关产品推荐

