表中cte查询的初始sql

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

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

  1. WITH Tap AS (SELECT DISTINCT
  2. account_id,
  3. MONTH(t_start) AS month,
  4. DAY(t_start) AS day
  5. FROM knowledge_repeat)
  6. SELECT DISTINCT
  7. account_id,
  8. COUNT(account_id) as 'Unique',
  9. CASE
  10. WHEN COUNT(account_id) > 10 THEN 'Super Loyal'
  11. WHEN COUNT(account_id) > 5 AND COUNT(account_id) < 10 THEN 'Semi Loyal'
  12. WHEN COUNT(account_id) > 2 AND COUNT(account_id) < 5 THEN 'Tried It'
  13. WHEN COUNT(account_id) = 1 THEN 'Tried it once'
  14. ELSE 'Crazy Keen'
  15. END AS 'Loyalty Rating'
  16. FROM Tap
  17. 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上生成您想要的结果)。
下面是一个镜头:

  1. select
  2. account_id,
  3. cnt `Unique`,
  4. case
  5. when cnt > 10 then `Super Loyal`
  6. when cnt > 5 then `Semi Loyal`
  7. when cnt > 2 then `Tried It`
  8. when cnt = 1 then `Tried it once`
  9. else `Crazy Keen`
  10. end as `Loyalty Rating`
  11. from (
  12. select
  13. account_id,
  14. count(distinct month(t_start), month(t_day)) as cnt
  15. from knowledge_repeat
  16. group by account_id
  17. ) 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 表达式按顺序执行-因此不需要为条件指定上界,因为它们已被前面的分支覆盖
您需要使用反引号来引用标识符,而不是单引号

展开查看全部

相关问题