【发布时间】:2009-10-01 15:35:08
【问题描述】:
我正在使用一个名为 CELCAT 的时间表应用程序,并试图提取一些关于何时应标记学生以进行报告的数据...这似乎非常困难,因为在登记册上添加和删除学生的方式是结构化的见下文:
studentid eventid fromdatetime addition removal
25149 25145 2009-09-12 10:30:00.000 Y NULL
25149 25145 2009-09-12 10:30:00.000 NULL Y
25149 25145 2009-09-12 10:30:00.000 Y NULL
25150 23013 2009-09-08 09:00:00.000 Y NULL
25150 23554 2009-09-07 09:00:00.000 Y NULL
25150 25145 2009-09-12 10:30:00.000 Y NULL
25150 25145 2009-07-27 00:00:00.000 NULL Y
25150 25145 2009-09-12 10:30:00.000 Y NULL
25150 25145 2009-09-12 10:30:00.000 NULL Y
25150 25145 2009-09-12 10:30:00.000 Y NULL
25150 25148 2009-09-12 15:00:00.000 Y NULL
25151 25145 2009-09-12 10:30:00.000 Y NULL
25151 25145 2009-10-10 00:00:00.000 NULL Y
25152 25145 2009-09-19 10:30:00.000 Y NULL
25152 25145 2009-07-27 00:00:00.000 NULL Y
因此,添加一个学生意味着他们应该从该日期起在登记册中进行标记(登记册是每周重复发生的事件,具有自己的周概况,不过我可以处理这方面的事情)。删除意味着学生不需要在此日期之后被标记,但是可能会添加、删除学生,然后在以后的一周内重新添加。
我认为能让我朝着正确方向前进的方法是获得一个结构表
studentid eventid fromdate todate
25149 25145 2009-09-12 10:30:00.000 2009-09-28 10:30:00.000
25149 25145 2009-10-13 10:30:00.000 2009-10-24 10:30:00.000
任何想法如何做到这一点?或者更好的建议?我想它会涉及到一些游标的使用,除非有人有一个很棒的解决方案。表格由 CELCAT 设计,不能修改。
哦,是的,它是 sql server 2005。
EDIT by KM,这里有一些用于测试解决方案的代码:
DECLARE @YourTable table (studentid int
,eventid int
,fromdatetime datetime
,addition char(1)
,removal char(1)
)
SET NOCOUNT ON
INSERT INTO @YourTable VALUES (25149,25145,'2009-09-12 10:30:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25149,25145,'2009-09-12 10:30:00.000', NULL,'Y')
INSERT INTO @YourTable VALUES (25149,25145,'2009-09-12 10:30:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25150,23013,'2009-09-08 09:00:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25150,23554,'2009-09-07 09:00:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25150,25145,'2009-09-12 10:30:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25150,25145,'2009-07-27 00:00:00.000', NULL,'Y')
INSERT INTO @YourTable VALUES (25150,25145,'2009-09-12 10:30:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25150,25145,'2009-09-12 10:30:00.000', NULL,'Y')
INSERT INTO @YourTable VALUES (25150,25145,'2009-09-12 10:30:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25150,25148,'2009-09-12 15:00:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25151,25145,'2009-09-12 10:30:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25151,25145,'2009-10-10 00:00:00.000', NULL,'Y')
INSERT INTO @YourTable VALUES (25152,25145,'2009-09-19 10:30:00.000','Y' ,NULL)
INSERT INTO @YourTable VALUES (25152,25145,'2009-07-27 00:00:00.000', NULL,'Y')
SET NOCOUNT OFF
【问题讨论】:
-
如何从给定的样本数据中获取这两个日期范围行?当您想要的“答案”与给定的样本数据不匹配时,很难为您进行查询。
-
此表/视图中是否有另一列指示添加记录时的时间戳或至少增量标识符?如果不是,那么很难为 ID=25149 的学生制定逻辑,因为他在同一事件中添加和删除了 3 次,但不清楚首先做了什么。
-
如果您指出您希望得到什么“最终”结果,而不仅仅是“..正确的方向..”,这也会有所帮助。谢谢
-
您如何在提出问题的同时向那些试图提供帮助的人提供零反馈?
标签: sql sql-server sql-server-2005 tsql