sql - 给定一列有效日期,是否有 SQL 语句可以将其转换为日期范围?

标签 sql sqlite range

与我发布的另一个问题类似,给出下表...

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/

相关文章:

mysql - SQL 获取值,然后计算这些值的总数

sqlite - 使用标题将SQLite空表导出到csv

android - 无法启动 Activity ComponentInfo

javascript - JS 中的 GCD - 超出最大调用堆栈

c# - C#查询未返回任何内容

sql - 从数据库模型中消除可空列的选项(为了避免 SQL 的三值逻辑)?

mysql - 如何使用 group-concat mysql 创建 json 格式?

c# - 从两个表中获取不同记录的 Linq 查询

javascript - 替换 HTML 然后将文档片段添加回 html

algorithm - 范围 split 问题