表中cte查询的初始sql

x6yk4ghg  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(410)

我正在尝试运行以下sql查询

WITH Tap AS (SELECT DISTINCT 
    account_id,
    MONTH(t_start) AS month,
    DAY(t_start) AS day
FROM knowledge_repeat)
SELECT DISTINCT 
    account_id, 
    COUNT(account_id) as 'Unique',
    CASE
        WHEN COUNT(account_id) > 10 THEN 'Super Loyal'
        WHEN COUNT(account_id) > 5 AND COUNT(account_id) < 10 THEN 'Semi Loyal'
        WHEN COUNT(account_id) > 2 AND COUNT(account_id) < 5 THEN 'Tried It'
        WHEN COUNT(account_id) = 1 THEN 'Tried it once'
        ELSE 'Crazy Keen'
    END AS 'Loyalty Rating'
FROM Tap
GROUP BY account_id

但是得到以下错误
[mysql][odbc 8.0(w)driver][mysqld-5.7.25-google-log]您的sql语法有错误;请查看与您的mysql服务器版本对应的手册,以了解在第1行初始sql错误处使用“tap as(select distinct account\u id,month(t\u start)as month,day(t\u start)as”附近的正确语法。检查语法是否正确,以及您是否具有对请求的数据库的访问权限。
我不明白为什么-它在ssms中运行良好,在我读过的各种论坛上,cte查询应该在tableau的初始sql部分工作。
感谢您的帮助!

k3fezbri

k3fezbri1#

从错误消息中可以看出,您正在运行的MySQL5.7不支持 WITH 子句(又称公共表表达式)。此功能仅在版本8.0中添加。
对于您的查询,您可以简单地将cte转换为子查询。但是我仍然怀疑您的代码可以大大简化(当然,假设它当前在一些非mysql datatabase上生成您想要的结果)。
下面是一个镜头:

select 
    account_id,
    cnt `Unique`,
    case
        when cnt > 10 then `Super Loyal`
        when cnt > 5  then `Semi Loyal`
        when cnt > 2  then `Tried It`
        when cnt = 1  then `Tried it once`
        else `Crazy Keen`
    end as `Loyalty Rating`
from (
    select
        account_id,
        count(distinct month(t_start), month(t_day)) as cnt
    from knowledge_repeat
    group by account_id
) t

理论基础:
这将统计每个月/天的不同元组 account_id (这似乎是你的目的。) select s) ,依赖于sql标准的mysql扩展,该扩展允许在 count(distinct) -我们也可以这样说 count(distinct date_format(t_start, '%m-%d')) as cnt 我使用一个子查询just ouf of laziness在 case 表达,但这里并不严格需要
这个 case 表达式按顺序执行-因此不需要为条件指定上界,因为它们已被前面的分支覆盖
您需要使用反引号来引用标识符,而不是单引号

相关问题