文章目录
1. 第一段错误代码
1.1 题目地址:SQL81 牛客的课程订单分析(五)
SELECT t.user_id,
MIN(t.date),
DATEADD(DAY, 1, MIN(t.date)), # MySQL不支持
# DATE_ADD(MIN(t.date), INTERVAL 1 DAY), # MySQL支持
t.cnt
FROM (SELECT *,
COUNT(*) OVER(PARTITION BY user_id) cnt
FROM order_info
WHERE date > '2025-10-15'
AND status = 'completed'
AND product_name IN ('C++', 'Java', 'Python')
) t
WHERE t.cnt >= 2
GROUP BY t.user_id
ORDER BY t.user_id ASC
1.2 报错
Execution Error
SQL_ERROR_INFO: 'FUNCTION DATEADD does not exist'
1.3 解释
后来查询后得知,MySQL中对应DATEADD()
的用法是DATE_ADD()
,比如求日期date
后面的一天:
SQL
:DATEADD(DAY, 1, date)
MySQL
:DATE_ADD(date, DAY, 1)
1.4 解决
将相应部分改为 DATE_ADD(MIN(t.date), INTERVAL 1 DAY)
即可。
问题是该题其实还有一个bug
,虽然代码运行没有问题,但是不符合题目要求:
因为使用日期加一得到的结果并非一定是实际表格中该行数据的下一条数据!(这里实际上还是要使用排序窗口函数:ROW_NUMBER() OVER()
)
该题正确题解如下:
SELECT t.user_id,
MIN(t.date) first_buy_date,
# DATEADD(DAY, 1, MIN(t.date)), # MySQL不支持
# DATE_ADD(MIN(t.date), INTERVAL 1 DAY), # MySQL支持
MAX(t.date) second_buy_date,
t.cnt
FROM (SELECT *,
COUNT(*) OVER(PAR