我有一个T-SQL报价表,需要能够计算过去几个月中有多少报价处于未结状态。
我必须使用的日期是'Add_Date'时间戳和'Update_Date'时间戳。将报价放入该列中值为“1”的“赢”或“损失”列后,将无法再更新报价。因此,'Update_Date'实际上成为Closed_Status时间戳。
以下是一些示例记录:
Quote_No Add_Date Update_Date Open_Quote Win Loss
001 01-01-2016 NULL 1 0 0
002 01-01-2016 3-1-2016 0 1 0
003 01-01-2016 4-1-2016 0 0 1
以下是此处所有数据的链接: https://drive.google.com/open?id=0B4xdnV0LFZI1T3IxQ2ZKRDhNd1k
I asked this question previously this year并且一直在使用以下代码:
with n as (
select row_number() over (order by (select null)) - 1 as n
from master..spt_values
)
select format(dateadd(month, n.n, q.add_date), 'yyyy-MM') as yyyymm,
count(*) as Open_Quote_Count
from quotes q join
n
on (closed_status = 1 and dateadd(month, n.n, q.add_date) <= q.update_date) or
(closed_status = 0 and dateadd(month, n.n, q.add_date) <= getdate())
group by format(dateadd(month, n.n, q.add_date), 'yyyy-MM')
order by yyyymm;
问题是此代码返回累计值。所以1月份还不错,但是2月真的是1月+ 2月,3月是1月+ 2月+ 3月等等。我花了一段时间才发现这个,现在返回的数字,离开我想要纠正它们。
从完整数据集中,此代码的结果为:
Year-Month Open_Quote_Count
2017-01 153
2017-02 265
2017-03 375
2017-04 446
2017-05 496
2017-06 560
2017-07 609
期望的结果是在特定月份期间有多少报价处于未结状态,而不是累计:
Year-Month Open_Quote_Count
2017-01 153
2017-02 112
2017-03 110
2017-04 71
提前感谢您的帮助!
答案 0 :(得分:1)
除非我遗漏了某些东西,否则LAG()将非常适合
示例强>
Declare @YourTable Table ([Year-Month] varchar(50),[Open_Quote_Count] int)
Insert Into @YourTable Values
('2017-01',153)
,('2017-02',265)
,('2017-03',375)
,('2017-04',446)
,('2017-05',496)
,('2017-06',560)
,('2017-07',609)
Select *
,NewValue = [Open_Quote_Count] - lag([Open_Quote_Count],1,0) over (Order by [Year-Month])
From @YourTable --<< Replace with your initial query
<强>返回强>
Year-Month Open_Quote_Count NewValue
2017-01 153 153
2017-02 265 112
2017-03 375 110
2017-04 446 71
2017-05 496 50
2017-06 560 64
2017-07 609 49