我有一个包含 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/