下午好,
希望你们一切顺利,祝你新年快乐。
我在写一个LAG函数不一致的查询时遇到了一些奇怪的行为。
基本上,我有一个数据集(由2个CTE组成),每个数据集包含月份(以MMM-YYYY格式),然后一个包含打开的票证计数,另一个包含相同的但是关闭票证。
我当时正在做的是添加一个'Backlog'列(在所有情况下第一个月都是0)和一个'Carried Forward'列。承诺金额将是该月的余额(创建+积压),并将反映为下个月的积压。
直到我意识到负面的积压工作有点捏造这些数字之前,我已经很好地完成了这个问题。我的意思是,例如:
在这种情况下,我不得不将任何负面积压归零以用于报告目的。
这似乎是问题发生的地方。在最初的几个月里,一切都会好起来的 - 价值是正确的,推进正确的数字,并将它们计入相应的计算中。但随后它将带来一些(看似)不确定的起源,当然,这对于此时的准确性具有连锁效应。
使用SQL Server 2012引入的Window函数,这应该是非常基本的 - 但显然不是!
虽然我很乐意发布代码(我已经尝试了几种方法来剥离这只猫),我觉得如果有人能够高度概述它应该如何编写,我会看到我立刻出错了。在这样做的时候,我会相应地回应我的完成尝试。
非常感谢你提前!
结果错误图片:
, OpenClosed AS
(
SELECT
c.[Created Month] 'Month'
, c.Tickets 'Created'
, r.Tickets 'Resolved'
, IIF( ( c.Tickets - r.Tickets ) < 0, 0, ( c.Tickets - r.Tickets ) ) 'Balance'
FROM
Created c
JOIN Resolved r ON
c.[Created Month] = r.[Resolved Month]
)
, CarryForward AS
(
SELECT
ROW_NUMBER() OVER( ORDER BY CAST( '1.' + Month AS DATETIME ) ) 'Row No'
, Month 'Month'
, Created 'Created'
, Resolved 'Resolved'
, LAG( Balance, 1, 0 ) OVER( ORDER BY CAST( '1.' + Month AS DATETIME ) ) 'Backlog'
, IIF( ( ( Created + LAG( Balance, 1, 0 ) OVER( ORDER BY CAST( '1.' + Month AS DATETIME ) ) ) - Resolved ) < 0
, 0
, ( ( Created + LAG( Balance, 1, 0 ) OVER( ORDER BY CAST( '1.' + Month AS DATETIME ) ) ) - Resolved )
) 'Carry Forward'
FROM
OpenClosed
)
SELECT
c1.Month 'Month'
, c1.Created 'Created'
, c1.Resolved 'Resolved'
, c2.[Carry Forward] 'Backlog'
, IIF( ( c1.Created + c2.[Carry Forward] ) - c1.Resolved < 0
, 0
, ( c1.Created + c2.[Carry Forward] ) - c1.Resolved
) 'Carried Forward'
FROM
CarryForward c1
JOIN CarryForward c2 ON
c2.[Row No] = c1.[Row No]-1
来自对问题的评论。顺便说一句,Created Month
列应该以某种方式重做,以便将年份放在月份之前 - 就像2015-01
一样。这将确保默认排序算法的正确排序。
如果日期必须在最终报告中显示为Jan-2015
,请将该表示工作作为查询中的最后一步。
WITH ticket_account AS
(
SELECT
c.[Created Month] AS Month
,c.Tickets AS Created
,r.Tickets AS Resolved
FROM
Created AS c
INNER JOIN
Resolved AS r
ON c.[Created Month] = r.[Resolved Month]
)
SELECT
*
,(SUM(Created) OVER (ORDER BY Month ASC) - SUM(Resolved) OVER (ORDER BY Month ASC)) AS Balance
FROM
ticket_account