【发布时间】:2014-06-12 09:47:57
【问题描述】:
假设一个简单的查询如:
从 SampleTable 中选择名称、角色、placeOfWork、startDate、endDate
显示员工的姓名,他们在工作场所从开始日期到结束日期所担任的角色。当工作分配为当前时,结束日期为空。
我有一个这样的查询的结果集,我会在其中返回这样的样本:
Jack Cook Jimmy's Burger Joint 01-01-2010 21-01-2010
Jack Cook Jimmy's Burger Joint 21-01-2010 31-03-2010
Jack Cook Jimmy's Burger Joint 31-03-2010 24-12-2010
Ronald Marketing McDonald's 01-01-2010 22-01-2010
Ronald Marketing McDonald's 22-01-2010 06-06-2010
Ronald Marketing McDonald's 06-06-2010 NULL
Jack Cosmonaut NASA 01-01-2011 NULL
...
我想将工作分配汇总为“单个概念性的”,例如:
Jack Cook Jimmy's Burger Joint 01-01-2010 24-12-2010
Ronald Marketing McDonald's 01-01-2010 NULL
Jack Cosmonaut NASA 01-01-2011 NULL
...
我想尽可能避免使用临时表,因为我需要从不同的地方运行查询。我无法使用内部联接或 group by。
【问题讨论】:
-
您使用的是哪个 DBMS?
-
Sybase 但我希望这可以是 ANSI sql
-
实际的解决方案会因 DBMS 而异,但我解决这些问题的一般方法是将您的范围扩展为行,即
01-01-2010 --> 05-01-2010扩展为 5 行。然后你有一个集合,你可以应用gaps and islands 逻辑。可以通过加入数字表来扩展日期。如果下一个开始日期总是等于上一个结束日期,那么您可以使用可能更快的递归来解决这个问题。 -
观察:Ronald 的记录有大约 4 个月的差距。在这种情况下,您显示的输出是否与您的单条记录概念一致?
-
确实是例子的问题,我更新了
标签: sql