首页 > 解决方案 > Tableau 中 CTE 查询的初始 SQL

问题描述

我正在尝试运行以下 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 行 Initial SQL Error 的“Tap AS (SELECT DISTINCT account_id, MONTH(t_start) AS month, DAY(t_start) AS”附近使用正确的语法。检查语法是否正确,并且您对请求的数据库具有访问权限。

我不明白为什么 - 它在 SSMS 和我读过的各种论坛上运行良好 CTE 查询应该在 Tableau 的初始 SQL 部分中运行。

任何帮助表示赞赏!

标签: mysqlsqlcounttableau-apicommon-table-expression

解决方案


如错误消息中所示,您正在运行的 MySQL 5.7 不支持WITH子句(又名公用表表达式)。此功能仅在 8.0 版中添加。

对于您的查询,您可以简单地将 CTE 转换为子查询。但是我仍然怀疑您的代码可以大大简化(当然,假设它当前在某些非 MySQL 数据库上产生了您想要的结果)。

这是一个镜头:

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(这似乎是嵌套selects 的目的),依赖于允许元组进入的 SQL 标准的 MySQL 扩展count(distinct)- 我们也可以将其表述为count(distinct date_format(t_start, '%m-%d')) as cnt

  • 我只是出于懒惰而使用子查询在表达式中一次又一次地键入相同的聚合函数case,但这里并不严格需要

  • 表达式按case顺序执行 - 因此无需指定条件的上限,因为它们已被前面的分支覆盖

  • 您需要使用反引号来引用标识符而不是单引号


推荐阅读