根据dwd层usercontinueorder表统计在两天内连续下单并且下单金额保持增长的用户,存入MySQL数据库shtd_result的usercontinueorder表
时间: 2023-11-28 16:49:49 浏览: 280
假设dwd层usercontinueorder表的结构如下:
| 列名 | 数据类型 |
|------|----------|
| user_id | int |
| order_date | date |
| order_amount | decimal |
那么可以通过以下SQL语句实现所需功能:
```
INSERT INTO shtd_result.usercontinueorder (user_id)
SELECT DISTINCT t1.user_id
FROM dwd.usercontinueorder t1
JOIN (
SELECT user_id, order_date, order_amount,
CASE
WHEN @prev_user != user_id THEN @prev_amount := NULL
WHEN @prev_date != order_date THEN @prev_amount := NULL
END AS reset_prev_amount,
CASE
WHEN @prev_user := user_id THEN NULL
WHEN @prev_date := order_date THEN NULL
END AS set_prev_user_date,
@prev_amount AS prev_amount,
@prev_amount := order_amount AS curr_amount
FROM dwd.usercontinueorder, (SELECT @prev_user := NULL, @prev_date := NULL, @prev_amount := NULL) t
ORDER BY user_id, order_date
) t2 ON t1.user_id = t2.user_id AND t1.order_date = t2.order_date AND t1.order_amount > IFNULL(t2.prev_amount, 0)
WHERE DATE_ADD(t1.order_date, INTERVAL 1 DAY) = (
SELECT MIN(DATE_ADD(order_date, INTERVAL 1 DAY))
FROM dwd.usercontinueorder
WHERE user_id = t1.user_id AND order_date > t1.order_date
);
```
这里使用了MySQL中的变量和子查询,具体解释如下:
- `@prev_user`, `@prev_date`, `@prev_amount` 是MySQL中的用户自定义变量,用于在查询中保存上一个记录中的值。
- `IFNULL(t2.prev_amount, 0)` 是为了处理第一条记录的情况,此时 `t2.prev_amount` 为NULL,应该返回0,避免出现NULL值。
- 子查询 `SELECT MIN(DATE_ADD(order_date, INTERVAL 1 DAY)) FROM dwd.usercontinueorder WHERE user_id = t1.user_id AND order_date > t1.order_date` 用于查找当前记录的下一个记录的日期,即第三天的日期。如果不存在下一个记录,则当前记录不满足条件,不会被插入到 `shtd_result.usercontinueorder` 表中。
需要注意的是,这里假设MySQL中已经配置好了用户和数据库,并且已经将dwd和shtd_result两个schema分别对应到了名为 `dwd` 和 `shtd_result` 的数据库上。如果没有配置,需要先创建相应的用户和数据库,同时也需要根据实际情况修改SQL语句中的表名、列名和其他参数。
阅读全文