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

时间:2014-12-04 06:14:41

标签: 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

最后一个状态条目需要提前一天来解释被推送的第二个条目,但我无法通过递归方式做到这一点。我已经考虑通过光标运行它,但这似乎有点矫枉过正,但也许没有别的办法......

任何人都有关于如何做到这一点的建议?我在MySQL中运行它可以设置程序,但是如果某人有一个不能在MySQL中工作的选项,那么我可以将它转换为RedShift。提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

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