SQL xin手错误鉴赏以及成长小结

1. 第一段错误代码

1.1 题目地址:SQL81 牛客的课程订单分析(五)

点击: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后面的一天:
SQLDATEADD(DAY, 1, date)
MySQLDATE_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值