<< Click to Display Table of Contents >> 综合应用 |
❖@query 的实现
•@query 的功能介绍
通过 @query 我们可以实现的功能如下:
1. 如果用户想去动态的查询一些信息,比如我想查询浏览过京东和淘宝的用户的信息,或者我想查询既购买牙刷又购买牙膏的用户的信息的时候,我就可以通过 @query 的方式进行动态的查询数据。
2.@query 可以减少数据集的新建数量,比如想实现 20 个不同数据集的关联,我可能需要创建 20 个数据集,但是通过使用 @query 就可以大大减少数据集的数量,我们可以通过给 @query 动态的传递不同的值就能实现不同的数据集关联的问题。
•@query 的定义
@query 是一个动态的数据集,定义它是只需要定义数据库的连接信息就可以,只需要在 SQL 语句中写 ?{@sql} 就可以动态的接收不同的 SQL 语句。
➢例如:
1)定义一个 ?{@sql} 进行接收 SQL 语句,名称为 aa。
2)创建新的数据集 query,用来进行参数的传递,名称为 query2。
select "Order Id","Market","Cogs" from "Coffee Sales Data of China Market" where "Order Id" in ?{a} OR "Order Id" in ?{b}
如下图:
3)创建 Script 数据集
// 需要制定为 true,这样我们才不会去使用 Meta Columns, 因为 Meta Columns 是静态的,而不是动态的。
param["_DYNAMIC_SQL_"]=true;
// 条件 1
param["sql"] = "select * from COFFEE_CHAIN where STATE in ?{state}";
param["state"] = ["Ohio","Florida","Texas"];
var grid = execute(this, SQL, "aa");
// 将其转化为数组的形式
var size = grid.size(-1); //size 函数是计算行数;
var arr = grid!=null ? toArray(grid,0) : []; // 转化为数组
// 条件 2
param["sql"] = "select * from ORDERS where STATE in ?{state1}";
param["state1"] = ["CA","NJ"];
var grid1=execute(this, SQL, "aa");
var size1 = grid1.size(-1);
var arr1 = grid1!=null ? toArray(grid1,0) : []; // 转化为数组
// 将两个不同条件的参数进行传递过去
param["a"]=arr;
param["b"]=arr1;
var grid2=execute(this, SQL, "query2");
// 返回 datagrid 的数据
grid2;
4. 运行刷新数据预览就能看到我们想要的数据。
❖实现数据集市数据集的 JOIN 和 SUB QUERY
在 数据集市数据集中不支持 JOIN 和 SUB QEURY,我们需要将数据集进行拆分出来,然后再通过 Script数据集进行连接起来。
JOIN 的实现方式 :有两个不同的 query1 和 query2,然后通过他们之间的共同的字段进行 join, 并且写出保留字段。
SUB QUERY 的实现方式:新建一个 query1,然后在新建一个 query2,通过 query2 去访问 query1 进行实现 SUB QUERY 的功能。
➢例如:
所有网站的 UV 指标和日均 UV 指标。这个例子就包括了数据集市数据集如何实现的 JOIN 和 SUB QUERY。
具体的 SQL 语句如下:
Select ta.Site_ID, ta.UV, tb.AvgUV
From (
Select Site_ID, count(distinct panel_id) as UV
From webdata
group by site_id
)ta inner join
(
Select Site_ID, Avg(UV)as AvgUV
From (
Select Site_ID, Dwd_date, count(distinct panel_id) as UV
From webdata
Group By Site_ID, dwd_date
)tb on ta.Site_ID = tb.Site_ID
在我们产品中的运行方式如下:
1. 新建一个 query, Select Site_ID, Dwd_date, count(distinct panel_id) as UV from webdata group by Site_ID, Dwd_date
2. 再新建一个 query1,
Select Site_ID, Avg(UV)as AvgUV from query1 group by Site_ID
3. 新建一个 query2,
Select Site_ID, count(distinct panel_id) as UV From webdata group by Site_id
4.script query 把 query 和 query2 合并。
var lt = execute(this, SQL, "query");
var rt = execute(this, SQL, "query2");
var lkeys = [0];
var rkeys = [0];
var lcols = [0,1];
var rcols = [1];
join(this, FINAL_JOIN | LEFT_MAIN, LEFT_JOIN, lt, rt, lkeys, rkeys, lcols, rcols);
刷新预览就可以得到想要的数据。