与我发布的另一个问题类似,给出下表...
Promo EffectiveDate
------ -------------
PromoA 1/1/2016
PromoB 4/1/2016
PromoC 7/1/2016
PromoD 10/1/2016
PromoE 1/1/2017
将其转换为开始日期和结束日期的最简单方法是什么,就像这样......
Promo StartDate EndDate
------ --------- ---------
PromoA 1/1/2016 4/1/2016
PromoB 4/1/2016 7/1/2016
PromoC 7/1/2016 10/1/2016
PromoD 10/1/2016 1/1/2017
PromoE 1/1/2017 null (ongoing until a new Effective Date is added)
更新
相关查询似乎是最简单的解决方案,但据我了解,它们效率极低,因为子查询必须在外部选择的每行运行一次。
我认为潜在的解决方案是第二次从表中选择值,但消除第一个结果,然后使用简单的外部左连接将它们与按序数索引的第一个选择配对.
举个例子,用字母代替上面的日期,第一个选择将类似于 A,B,C,D,E,第二个选择将是 B,C,D,E(这是第一个选择减去第一个记录 ' A'),然后通过序数索引和简单的外部左连接将它们配对,产生 A-B、B-C、C-D、D-E、E-null。但是我无法弄清楚实现该功能的语法。
最佳答案
关联子查询可以查找您需要的附加字段。
SELECT
yourTable.*,
(
SELECT MIN(lookup.EffectiveDate)
FROM yourTable AS lookup
WHERE lookup.EffectiveDate > yourTable.EffectiveDate
)
FROM
yourTable
编辑
“每行必须运行一次”的概念是对 SQL 如何生成实际运行的执行计划的误解。对于将一个表连接到另一个表也可以这样说,连接必须每行至少运行一次......相关子查询确实有更大的成本,但使用适当的索引就不会“极高”,并且所描述的功能确实保证了这一点。
如果您有另一个字段保证是连续的,那么这将是微不足道的,但不要 尝试重新使用现有的 Promo 字段来实现该额外目的。
SELECT
this.*,
next.EffectiveEpoch
FROM
yourTable this
LEFT JOIN
yourTable next
ON next.sequential_id = this.sequential_id + 1
关于sql - 给定一列有效日期,是否有 SQL 语句可以将其转换为日期范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39100170/