【发布时间】:2014-11-26 14:30:03
【问题描述】:
给定一个存储每个项目的每个修订的表。
例如:
+--------+----------+---------------+--------+---------------------+
| ItemId | Revision | PreviousState | State | DateChanged |
+--------+----------+---------------+--------+---------------------+
| 1 | 1 | NULL | New | 2014-11-13 10:00:00 |
| 1 | 2 | New | Active | 2014-11-15 10:00:00 |
| 1 | 3 | Active | New | 2014-11-17 10:00:00 |
| 1 | 4 | New | Active | 2014-11-19 10:00:00 |
| 1 | 5 | New | Active | 2014-11-20 10:00:00 |
| 1 | 6 | Active | Closed | 2014-11-22 10:00:00 |
| 2 | 1 | NULL | New | 2014-11-13 10:00:00 |
| 2 | 2 | New | Active | 2014-11-16 10:00:00 |
| 2 | 3 | Active | Closed | 2014-11-17 10:00:00 |
| 2 | 4 | Closed | Active | 2014-11-19 10:00:00 |
| 2 | 5 | Active | Closed | 2014-11-21 10:00:00 |
+--------+----------+---------------+--------+---------------------+
我需要计算每个项目处于每个状态的天数(“关闭”除外)。
结果应该是这样的:
+--------+-----+--------+
| ItemId | New | Active |
+--------+-----+--------+
| 1 | 4 | 5 |
| 2 | 3 | 3 |
+--------+-----+--------+
我尝试使用两种方法 - GROUP BY 和嵌套游标。
使用游标(尤其是嵌套游标)是一种不好的做法。而且速度很慢。
GROUP BY 也不起作用,因为没有严格的状态顺序(新 -> 活动 -> 关闭)。它可能是混乱的 New -> Active -> Closed -> Active -> Closed -> New -> Closed。
如果不迭代所有记录并比较状态,我看不到任何其他计算方法。
有什么解决办法吗?
提前致谢。
【问题讨论】:
-
对我来说似乎是一个存储过程或脚本(如 php)任务
-
fwiw,我会尽力避免 NULL。它使各种标准变得不必要地复杂,因为在设计上,NULL 仅适用于 IS NULL 和 IS NOT NULL。例如,您可以在 PreviousState 上使用 N/A 来获取 NEW。
标签: sql tsql sql-server-2012 cursor