【发布时间】:2017-12-08 19:03:25
【问题描述】:
我有一个看起来像这样的表(没有尝试列):
Account Status Date Attempt(*)
A In_PROGRESS 12/12/2017 1
A ERROR 13/12/2017 1
A SUCCESS 15/12/2017 2
B ERROR 10/12/2017 1
B SUCCESS 13/12/2017 2
C IN_PROGRESS 11/12/2017 1
C ERROR 13/12/2017 1
C ERROR 14/12/2017 2
C IN_PROGRESS 15/12/2017 3
我想获取 Attempt(*) 列。 ERROR 和 SUCCESS 状态是结束状态。例如,对于账户 C,我们知道第一次尝试产生了 ERROR,第二次尝试产生了 ERROR,第三次尝试产生了 IN_PROGRESS。
我知道由于暂时状态“IN_PROGRESS”,单独的 RANK() 不起作用。例如,如果我要去:
RANK() OVER(PARTITION BY Account ORDER BY Date ASC)
我会得到:
Account Status Date Attempt(*)
A In_PROGRESS 12/12/2017 1
A ERROR 13/12/2017 2
A SUCCESS 15/12/2017 3
B ERROR 10/12/2017 1
B SUCCESS 13/12/2017 2
C IN_PROGRESS 11/12/2017 1
C ERROR 13/12/2017 2
C ERROR 14/12/2017 3
C IN_PROGRESS 15/12/2017 4
不考虑暂时状态。我会使用第二个表中的结果来创建一个新列以获得所需的结果,sudo 代码将类似于:
New_Attempt[n] = if Attempt(*) = 1 then 1 else (if Attempt(*) > 1 and Status[n-1] in(ERROR, SUCCESS) then Attempt[n-1] + 1 else Attempt [n-1])
其中 'n' 是行号。
我对 SQL 比较陌生,我研究过 NTILE 和 DENSE_RANK 等其他排名函数,但我仍然想不出办法。
附:我在 SQL Server Management Studio 2008 中使用 T-SQL
谢谢! :)
【问题讨论】:
-
您在这里确定“尝试”的逻辑是什么。仅看您的示例还不清楚。是“只要记录不是“In_PROGRESS”,我们就会添加到
Accounts尝试中,在这种情况下Attempt不会增加”? -
"*除非
Account的最新记录是In_PROGRESS,否则将其视为一次尝试和增量"? -
您好 JNevill,对于不明确的解释深表歉意。是的,没错。因此,可以在存在 ERROR 或 SUCCESS 状态的点定义尝试的结束。在这些之前的任何事情都是下一次尝试。这有帮助吗?
-
请阅读this,了解一些改进问题的技巧。
-
与其添加线索作为 cmets,不如编辑您的问题以提供完整的解释。
标签: sql-server tsql