mysql - SQL递归添加日期直到数据集每天有一条记录

标签 mysql sql amazon-redshift

我有一个包含 lead_id、lead_status、effective_datetime 的数据集。状态可以在一天内改变几次。如果一天内有多个状态条目,我需要 DATE_ADD 1 天到第 2 个条目,2 天到第 3 个条目,等等,直到我有一个 lead_id、lead_status、effective_day 记录。这是我目前所拥有的:

首先我创建一个行号:

CREATE TABLE lead_rows AS
SELECT
    lead_id,
    effective_datetime,
    lead_status,
    (
        CASE lead_id
        WHEN @curLead 
        THEN @curRow := @curRow + 1 
        ELSE @curRow := 1 AND @curLead := lead_id END
    ) + 1 AS row_number
FROM lead_history, (SELECT @curRow := 0, @curLead := '') r
ORDER BY lead_id, effective_datetime;

然后我将当前行与上一行进行比较,以确定是否需要将当前行日期提前一天:

SELECT
    lead_id,
    lead_status,
    effective_datetime,
    CASE 
        WHEN DATE(a.effective_datetime) = (
            SELECT DATE(effective_datetime) 
            FROM lead_rows 
            WHERE row_number = (a.row_number - 1) AND lead_id = a.lead_id) 
        THEN DATE_ADD(DATE(a.effective_datetime), INTERVAL 1 DAY) 
        ELSE DATE(a.effective_datetime) 
    END as new_date 
FROM lead_rows a;

这很好用,除非我在相邻的日子里有两个状态条目。因为这不是递归的,所以它不会继续将后续状态条目向前推一天。所以我可以开始:

lead_id    | lead_status    | effective_datetime
---------------------------------------------------
lead_1     | Known          | 2014-01-01 01:00:00
lead_1     | In Contact     | 2014-01-01 14:00:00
lead_1     | Unqualified    | 2014-01-02 12:00:00

但结束于:

lead_id    | lead_status    | effective_datetime    | new_date
----------------------------------------------------------------
lead_1     | Known          | 2014-01-01 01:00:00   | 2014-01-01
lead_1     | In Contact     | 2014-01-01 14:00:00   | 2014-01-02
lead_1     | Unqualified    | 2014-01-02 12:00:00   | 2014-01-02

应该是什么时候:

lead_id    | lead_status    | effective_datetime    | new_date
----------------------------------------------------------------
lead_1     | Known          | 2014-01-01 01:00:00   | 2014-01-01
lead_1     | In Contact     | 2014-01-01 14:00:00   | 2014-01-02
lead_1     | Unqualified    | 2014-01-02 12:00:00   | 2014-01-03

最后一个状态条目需要提前一天来解释第二个条目被推送的原因,但我不知道如何递归地执行此操作。我已经研究过通过 Cursor 运行它,但这似乎有点矫枉过正,但也许没有其他办法......

有人对如何完成此任务有任何建议吗?我在 MySQL 中运行它,能够设置过程,但如果有人有一个在 MySQL 中不起作用的选项,那么我可以将它转换为 RedShift。提前致谢。

最佳答案

问题在于 SQL 如何执行您的 +1 操作。 SQL 不必在显示给您的订单条目中进行检查。

我想一个更简单的方法是在添加条目时进行检查(假设这个日期冲突很少见)并且有一个 trigger在新条目插入到表中时对其进行修改。

编辑: Update int column in table with unique incrementing values 似乎是一个类似的问题,基本上你设置一个计数器 i 并从 0 开始递增具有相同 id 相同日期的表。解决方案中的示例改为使用 i 中的日期。

关于mysql - SQL递归添加日期直到数据集每天有一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27287504/

相关文章:

PHP 错误类的对象无法转换为字符串

mysql - sql查询获取两个不同表的两行的乘积并将答案插入到两个表之一

amazon-web-services - 为什么 Redshift 在加入时会自动修剪 varchar 列?

sql - 有没有更好的方法通过 Redshift 中的 join 来避免数据倾斜?

mysql - 计数和加入 3 表时的错误期望

mysql - 对不同列中的 mysql 数据进行排序

sql - 使用数据作为外键删除具有其他表的 SQL 中的多个条目

mysql - 连接两个表 SQL

mysql - 在 mysql 中查找最近的空闲时间段的查询 - 为什么它不起作用?

amazon-web-services - 如何在redshift中找到数据库、模式、表的大小