在处理资产调度的应用程序中考虑下表:
date group_id free_spots
2011-01-01 1 0
2011-01-01 2 0
2011-01-08 1 1
2011-01-08 2 0
2011-01-15 1 1
2011-01-15 2 1
2011-01-22 1 2
2011-01-22 2 2
2011-01-29 1 1
2011-01-29 2 0
2011-02-05 1 0
2011-02-05 2 1
2011-02-12 1 0
2011-02-12 2 1
2011-02-19 1 0
2011-02-19 2 0
使用不同表的相当昂贵的查询(~100ms)将这些信息放在一起。结果可以放入临时表中,也可以直接内联使用。
我想要的是找到提供位置的第一个日期(free_spots > 0)。然后在同一个记录中,我想要提供一个位置的最后一个日期。所有这些都由 group_id 分组。
为了说明,在给定的示例表中,我希望得到以下输出:
group_id start_date end_date
1 2011-01-08 2011-01-29
2 2011-01-15 2011-01-22
2 2011-02-05 2011-02-12
现在,我已经想出了一个粗略的解决方案。使用给定的表我会:
- 获取前面*为 NULL 或 free_spots <= 0 (开始日期)的记录的所有记录
- 对于所有这些记录,获取第一个后继*,该后继 * 由 NULL 或 free_spots <= 0 的行所接
- 以某种方式在这里混合了 group_id 分组。
但是,这似乎是不可能的,因为我不能再次使用相同的子查询来查找后继或先前的记录。同样处理临时表。这些我不能多次打开和重复使用。
( * 之前或之后是基于日期。对于每个组,日期是相等的、连续的并且均匀(但任意)间隔。通常是 7 或 14 天)