Sql server 2005 SQL Server 2005中的增量计数
我正在使用SQLServer2005处理一个Raiser的边缘数据库。我已经编写了SQL,它将生成一个临时表,其中包含直接借记分期付款的详细信息。下面是一个小表格,其中包含我要问的问题的关键变量,以及一些虚构的数据:Sql server 2005 SQL Server 2005中的增量计数,sql-server-2005,counter,Sql Server 2005,Counter,我正在使用SQLServer2005处理一个Raiser的边缘数据库。我已经编写了SQL,它将生成一个临时表,其中包含直接借记分期付款的详细信息。下面是一个小表格,其中包含我要问的问题的关键变量,以及一些虚构的数据: Donor_ID Instalment_ID Instalment_Date Amount 1234 1111 01/01/2011 £5.00 1234 1112 01
Donor_ID Instalment_ID Instalment_Date Amount
1234 1111 01/01/2011 £5.00
1234 1112 01/02/2011 £0.00
1234 1113 01/03/2011 £5.00
1234 1114 01/04/2011 £5.00
1234 1115 01/05/2011 £0.00
1234 1116 01/06/2011 £0.00
2345 2111 01/01/2011 £0.00
2345 2112 01/02/2011 £5.00
2345 2113 01/03/2011 £5.00
2345 2114 01/04/2011 £0.00
2345 2115 01/05/2011 £0.00
2345 2116 01/06/2011 £0.00
如您所见,“金额”列中的某些值为0.00英镑。例如,当捐赠者的账户中资金不足时,就会发生这种情况
我想做的是编写一个SQL查询,该查询将创建一个包含连续0.00英镑付款增量计数的字段,该字段在非0.00英镑付款或更改捐赠者ID后重置。我已在下面复制了上述数据,以及我希望看到的字段
Donor_ID Instalment_ID Instalment_Date Amount New_Field
1234 1111 01/01/2011 £5.00
1234 1112 01/02/2011 £0.00 1
1234 1113 01/03/2011 £5.00
1234 1114 01/04/2011 £5.00
1234 1115 01/05/2011 £0.00 1
1234 1116 01/06/2011 £0.00 2
2345 2111 01/01/2011 £0.00 1
2345 2112 01/02/2011 £5.00
2345 2113 01/03/2011 £5.00
2345 2114 01/04/2011 £0.00 1
2345 2115 01/05/2011 £0.00 2
2345 2116 01/06/2011 £0.00 3
为了帮助澄清我在寻找什么,我认为我在寻找类似于足球队成绩列表上的连胜场。例如:
Opponent Score Winning_Streak
Arsenal 1-0 1
Liverpool 0-0
Swansea 3-1 1
Chelsea 2-1 2
Fulham 4-0 3
Stoke 0-0
Man Utd 1-3
Reading 2-1 1
我考虑过各种选择,但没有取得任何进展。除非我错过了一些明显的东西,否则我认为可能需要一个比我目前的SQL编程级别更高级的解决方案 如果我正确地考虑了这个问题,我相信当金额为0.00磅时,您需要一个行号
Select 0 as As InsufficientCount
, Donor_ID
, Installment_ID
, Amount
From [Table]
Where Amount > 0.00
Union
Select Row_Number() Over (Partition By Donor_ID Order By Installment_ID)
, Donor_ID
, Installment_ID
, Amount
From [Table]
Where Amount = 0.00
此联合选择只应在金额等于0时为您提供“等级”。我正在调用您的新字段“等级金额”
然后,要更新该值,请执行以下操作:
UPDATE instalments
SET streakAmount =
(SELECT
COUNT(*)
FROM
instalments streak
WHERE
streak.donor_id = instalments.donor_id
AND
streak.instalment_date <= instalments.instalment_date
AND
(streak.instalment_date >
-- find previous instalment date, if any exists
COALESCE(
(
SELECT
MAX(instalment_date)
FROM
instalments prev
WHERE
prev.donor_id = instalments.donor_id
AND
prev.amount > 0
AND
prev.instalment_date < instalments.instalment_date
)
-- otherwise min date
, cast('1753-1-1' AS date))
)
)
WHERE
amount = 0;
这不会在付款时将条纹重置为0。只有当事务=0.00时,条纹才会增加,这就是@user2182597所描述的。我的查询仅在交易金额大于0时返回0。也许它应该返回NULL或空字符串。sqlfiddle.com/!6/a571f/28显示捐赠者ID有3个事务处理,其中金额=0.00,更合适的是“不足计数”增加。如图2345 2114所示,应为1,因为第2345 2113行将“不足计数”重置为0。相反,它说2。第2345 2111行是第一行,第2345 2114行是第二行。事务处理2112和2113的金额均大于0。
UPDATE instalments
SET streakAmount =
(SELECT
COUNT(*)
FROM
instalments streak
WHERE
streak.donor_id = instalments.donor_id
AND
streak.instalment_date <= instalments.instalment_date
AND
(streak.instalment_date >
-- find previous instalment date, if any exists
COALESCE(
(
SELECT
MAX(instalment_date)
FROM
instalments prev
WHERE
prev.donor_id = instalments.donor_id
AND
prev.amount > 0
AND
prev.instalment_date < instalments.instalment_date
)
-- otherwise min date
, cast('1753-1-1' AS date))
)
)
WHERE
amount = 0;