mysql - 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 部分中运行。
任何帮助表示赞赏!
解决方案
如错误消息中所示,您正在运行的 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
(这似乎是嵌套select
s 的目的),依赖于允许元组进入的 SQL 标准的 MySQL 扩展count(distinct)
- 我们也可以将其表述为count(distinct date_format(t_start, '%m-%d')) as cnt
我只是出于懒惰而使用子查询在表达式中一次又一次地键入相同的聚合函数
case
,但这里并不严格需要表达式按
case
顺序执行 - 因此无需指定条件的上限,因为它们已被前面的分支覆盖您需要使用反引号来引用标识符而不是单引号
推荐阅读
- php - GET 用户返回 Authorization_IdentityNotFound 错误
- java - Spring Boot Jackson 占用大量内存
- c++ - 我应该如何为我的班级编写构造函数
- javascript - 通过预签名 URL 将文件上传到 AWS S3 时 Javascript 不起作用
- binary - 如果减去二进制溢出怎么办
- c# - 虽然无法识别字符串中的内容
- bootstrap-4 - Bootstrap 4模式不显示
- sql - 窗口功能的替代品?(代码示例)
- python - 在 Python 理解的上下文中,什么是**可迭代表达式**?
- kotlin - 我不能为受保护的属性编写 getter 和 setter