You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL代码报Missing From Keyword错误的原因咨询及修正建议

SQL代码报Missing From Keyword错误的原因咨询及修正建议

嗨,我来帮你分析下这段SQL出问题的原因,以及怎么修正它~

首先说说引发"Missing From Keyword"错误的核心原因,同时你的代码还有逻辑漏洞需要补上:

  1. CTE语法不符合规范:你在ctes里写了select *, count(*) as sums FROM Trips join Users on client_id = users_id where banned = 'No' group by request_at,这里的select *包含了Trips和Users的所有列,但你只按request_at分组。在大多数SQL方言(比如PostgreSQL、开启严格模式的MySQL)中,GROUP BY子句必须包含SELECT列表里所有非聚合函数的列,这种写法会触发语法错误,有些数据库会把这类错误提示成容易混淆的"Missing From Keyword"。
  2. 逻辑漏洞:题目要求客户端和司机都不能被封禁,但你只关联验证了客户端的封禁状态,漏掉了司机的验证。
  3. 取消率计算逻辑错误:你试图用count(ctes.id)/ctes.sums计算取消率,但ctes.sums是CTE里每个日期的总请求数,在主查询筛选取消记录后再分组的场景下,直接引用这个聚合列是不成立的,无法正确对应总请求数和取消请求数的关系。

下面是修正后的SQL代码,完全符合题目要求:

WITH valid_trips AS (
    -- 先筛选出客户端和司机都未被封禁、且在指定日期范围内的请求
    SELECT t.request_at, t.status
    FROM Trips t
    JOIN Users u_client ON t.client_id = u_client.users_id AND u_client.banned = 'No'
    JOIN Users u_driver ON t.driver_id = u_driver.users_id AND u_driver.banned = 'No'
    WHERE t.request_at BETWEEN '2013-10-01' AND '2013-10-03'
),
daily_stats AS (
    -- 按日期统计总请求数和取消请求数
    SELECT 
        request_at,
        COUNT(*) AS total_requests,
        SUM(CASE WHEN status IN ('cancelled_by_driver', 'cancelled_by_client') THEN 1 ELSE 0 END) AS cancelled_requests
    FROM valid_trips
    GROUP BY request_at
)
-- 计算并格式化取消率
SELECT 
    request_at AS `Day`,
    ROUND(cancelled_requests / total_requests, 2) AS `Cancellation Rate`
FROM daily_stats;

我再给你拆解下修正的关键点:

  • 用两次JOIN分别验证客户端和司机的未封禁状态,完全符合题目要求;
  • 先通过valid_trips锁定所有有效请求,再用daily_stats统计每日的总请求和取消请求数量;
  • 最后直接用取消数除以总数计算取消率,语法和逻辑都更严谨,不会出现之前的语法错误。

备注:内容来源于stack exchange,提问作者Shivani Tiwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 09:53:07