书写规则
- 别名字段合法性:字母开头,只能包含数字、字母、下划线
- 查询字段不可使用 *
- 字段名称有特殊字符、数字 需要使用 ``
select 1
,database
from table
常量、方法产生的字段 需要设置别名
select 1 as a
select ‘a’ as a
select count(1) as total from table参数变量
可在sql中使用参数变量进行占位,真正在仪表盘内对变量进行赋值(仪表盘设置变量、下拉搜索绑定图表或表的参数变量)
使用方法 : ‘${变量 | 模拟值 | 是否必填}’
- 变量: 在仪表盘中 通过仪表盘设置变量、下拉搜索绑定图表或表的参数变量 进行赋值。在仪表盘中,需要对变量进行赋值,若不赋值或赋值为空,则相当于替换此处条件为true。eg: select app_name,app_desc from app where app_id = ‘${app_id | 123}’ and app_desc = ‘1’;在仪表盘中,未对app_id 进行赋值,执行结果为 select app_name,app_desc from app where app_desc = ‘1’;
- 模拟值: 可理解为默认值, 在查看我的数据时, 参数会替换为模拟值。
eg: 将此SQL保存为我的数据 select app_name,app_desc from app where app_id = ‘${app_id | 123}’;在<我的数据>列表查看时,展现的数据为 select app_name,app_desc from app where app_id = ‘123’;
- 是否必填:此参数只可填写 must / optional. 此参数为选填,默认为optional。
must 此参数为必须填写,例如 一般用于接收url传参,比如单活动分析,活动ID应为必填
optional 非必须填写
注意事项 :
1. 必须用双引号
2. 使用格式只限于 ‘${变量 | 模拟值}’ 或 ‘${变量 | 模拟值 | 是否必填}’,值的填写顺序不能颠倒
3. 模拟值仅限于在<我的数据>展现使用,在仪表盘使用变量时需要另赋值,如不赋值查询SQL会去除该过滤条件
select app_name,app_desc from app where app_id = '${app_id | 123}';
select sum(num) num,sum(num1) num1 from table where app_id = '${app_id | 0}' group by app_id;
- 语句变量 - 可定义sql代码块
正常:
select (select count(1) from dataview_connection) / (select count(1) from dataview_connection_mysql)
可视化:
${sql1} = select count(1) from dataview_connection;
${sql2} = select count(1) from dataview_connection_mysql;
select ${sql1} / ${sql2} as t1;
- 多行语句使用
可输入多行语句,“;”分隔,最终按最后一条返回数据,之前语句都是用于定义变量
- 系统变量
集成token验证后,sql语句中可直接使用 token解析出来的变量.
系统变量使用时,必须是非空字段
在添加系统变量的时候,还可以指定扩展变量
如上图,在我的数据插入系统变量时,使用 ${SYS_EXTEND.field} 即可
- eval 函数
使用eval 可在执行最终语句前,预先计算当前语句的值,但仅支持单值
${v1} = eval(select sum(custom_num) as v1 from custom_last_stat where day = date_sub(curdate(),interval 2 day) and company_id='${companyId}' and department_id in (${departments}) );
${v2} = eval(select ifnull(sum(custom_num),0) as v2 from custom_last_stat where day = date_sub(curdate(),interval 1 day) and company_id='${companyId}' and department_id in (${departments}));
select ((${v2} - ${v1}) / ${v1}) as t1;
- 分支语句的支持
支持ifnull,case…when…else,if(condition,exprValue,exprValue)
SELECT IF(`XB` ='男','1','2') a FROM student01
SELECT IFNULL(`bz`,'空值') a FROM zhuanjia
SELECT
'网络咨询(问诊)服务' AS namee,
tc.org_name AS yiyuan,
tc.org_code AS yiyuanbm,
(CASE WHEN tc.patient_age BETWEEN '0岁' AND '19岁' THEN '0岁-20岁'
WHEN tc.patient_age BETWEEN '21岁' AND '29岁' THEN '20岁-30岁'
WHEN tc.patient_age BETWEEN '30岁' AND '39岁' THEN '30岁-40岁'
WHEN tc.patient_age BETWEEN '40岁' AND '49岁' THEN '40岁-50岁'
WHEN tc.patient_age BETWEEN '50岁' AND '59岁' THEN '50岁-60岁'
WHEN tc.patient_age BETWEEN '60岁' AND '69岁' THEN '60岁-70岁'
WHEN tc.patient_age BETWEEN '70岁' AND '79岁' THEN '70岁-80岁'
WHEN tc.patient_age BETWEEN '80岁' AND '89岁' THEN '80岁-90岁'
WHEN tc.patient_age >= '90岁' THEN '>90岁' END) AS paage,
COUNT(1) AS syl,
tc.upload_time AS rq
FROM t_consult tc
GROUP BY rq,yiyuan,paage
不支持if, case...when 嵌套
- 可以使用#注释,多行也用#
#此行是注释
- sql变量与事件变量可以一起使用
{sql_1} = select project_name aaa from dataview_project where project_id='${event_id|01ba712c9d144f3086f8f875310a1fd4|must}';
{sql_2} =select username aaa from dataview_user where user_id='${event_id|468e46d55bfd493fb904d47922015da7|must}';
SELECT {sql_1} bbbbb
UNION
{sql_2} ;
between and与变量
- 当变量没有值,并且非必填,则相当于>=或者<=
## >=
select title,url,time
from zhaobiao
where time BETWEEN '2020-05-23' and '${event_time|0}'
##<=
select title,url,time
from zhaobiao
where time BETWEEN '${event_time|0}' and '2020-05-24'
- 原本sql中变量没有赋值,在仪表盘给变量赋值之后 相当于between ‘2020-05-23’ and ‘2020-05-25’
- 原本sql中变量没有赋值,在仪表盘给两个变量都赋值之后 相当于between ‘2020-05-23’ and ‘2020-05-24’
- 原本sql中变量没有赋值,在仪表盘给一个变量赋值之后 相当于>=’2020-05-24’
select title,url,time
from zhaobiao
where time BETWEEN '${event_A|0}' and '${event_B|1}'
- 单变量赋同样的值,相当于 ==’2020-05-24 22:10:21’
select title,url,time
from zhaobiao
where time BETWEEN '${event_C|0}' and '${event_C|1}'
- 不同变量均不赋值,相当于 where 1,显示全部数据
select title,url,time
from zhaobiao
where time BETWEEN '${event_V|0}' and '${event_V1|1}'
可选变量like
写法同mysql中的like,后面跟模糊表达式,%可以放在任意位置
where a like ‘%${Id | 1234}’ 必须以变量结尾
where a like ‘${Id | 1234}%’ 必须以变量开始
where a like ‘%${Id | 1234}%’ 只要包含变量就可以
示例:
ETL和INTERVAL函数
对区间进行分组并且统计落在各区间内的数据量
select elt(interval(a.pv,0, 10, 50, 100), '小于10次', '10-50次', '50-100次', '100次以上') as amt_level, count(a.user_id) as cnt
from `mp_shopping_stat`.`user_total_stat` a
group by elt(interval(a.pv, 0, 10, 50, 100), '小于10次', '10-50次', '50-100次', '100次以上');