sql

Parent Previous Next


语法


sql(select, from, [where], [groupBy], [groupFlag], [csort], [ascSort], [having], [orderBy], [ascOrder], [limit], [hint])


参数


select:选取的列。


from:选取数据的表。


where:where条件。如果有多个where条件,使用ANY向量来表示,每个元素对应一个条件的元代码。


groupBy:group by后面的关键字(列名)。如果有多个group by关键字,使用ANY向量来表示,每个元素对应一个列名的元代码。


groupFlag:1表示group by,0表示context by。默认值为1。


csort:csort后面的关键字(列名)。只有当groupFlag=0,即使用context by时,才能指定该参数。如果有多个csort关键字,使用ANY向量来表示,每个元素对应一个列名的元代码。


ascSort:表示csort关键字按升序或降序排列的整型标量或向量。1表示升序,0表示降序。默认值为1。


having:having条件。如果有多个having条件,使用ANY向量来表示,每个元素对应一个条件的元代码。


orderBy:order by后面的关键字(列名)。如果有多个order by关键字,使用ANY向量来表示,每个元素对应一个列名的元代码。


ascOrder:表示order by后面的关键字按升序或降序排列的整型标量或向量。1表示升序,0表示降序。默认值为1。


limit:整数,表示从第一行开始选取的行数。如果指定了groupBy,从每组的第一行开始选取limit行记录。它对应的是SQL中的top语句。


hint: 常量。目前该参数可以是HINT_HASH、HINT_SNAPSHOT或HINT_KEEPORDER。HINT_HASH表示执行group by查询时采用哈希算法,HINT_SNAPSHOT表示从快照引擎中查询数据,HINT_KEEPORDER表示执行context by后的结果仍然按原来的顺序排列。


详情


动态生成SQL语句。


例子



name = take(`GE,6) join take(`MSFT,6) join take(`F,6)

date=take(take(`2017.01.03,2) join take(`2017.01.04,4), 18)

PRC=31.82 31.69 31.92 31.8  31.75 31.76 63.12 62.58 63.12 62.77 61.86 62.3 12.46 12.59 13.24 13.41 13.36 13.17

vol=2300 3500 3700 2100 1200 4600 8800 7800 6400 4200 2300 6800 4200 5600 8900 2300 6300 9600

t1 = table(name, date, PRC, vol);

t1;

name date       PRC   vol

---- ---------- ----- ----

GE   2017.01.03 31.82 2300

GE   2017.01.03 31.69 3500

GE   2017.01.04 31.92 3700

GE   2017.01.04 31.8  2100

GE   2017.01.04 31.75 1200

GE   2017.01.04 31.76 4600

MSFT 2017.01.03 63.12 8800

MSFT 2017.01.03 62.58 7800

MSFT 2017.01.04 63.12 6400

MSFT 2017.01.04 62.77 4200

MSFT 2017.01.04 61.86 2300

MSFT 2017.01.04 62.3  6800

F    2017.01.03 12.46 4200

F    2017.01.03 12.59 5600

F    2017.01.04 13.24 8900

F    2017.01.04 13.41 2300

F    2017.01.04 13.36 6300

F    2017.01.04 13.17 9600


whereConditions = [<name=`MSFT>,<vol>x>];

havingCondition = <count(date)>3>;


sql(sqlCol("*"), t1);

< select * from t1 >


sql(sqlCol("*"), t1, whereConditions);

< select * from t1 where name == "`MSFT", vol>x >


sql(sqlColAlias(<avg(PRC)>), t1, whereConditions, sqlCol(`date));

< select avg(PRC) as avg_PRC from t1 where name == "MSFT",vol > x group by date >


sql(sqlColAlias(<avg(PRC)>), t1,, [sqlCol(`date),sqlCol(`name)]);

< select avg(PRC) as avg_PRC from t1 group by date,name >


sql(sqlColAlias(<avg(PRC)>), t1,, [sqlCol(`date),sqlCol(`name)],0);

< select avg(PRC) as avg_PRC from t1 context by date,name >


sql(sqlColAlias(<avg(PRC)>), t1, whereConditions, sqlCol(`date), 0);

< select avg(PRC) as avg_PRC from t1 where name == "MSFT",vol > x context by date >

// when groupFlag is set as 0, it means context by.


sql(sqlColAlias(<avg(PRC)>), t1, whereConditions, sqlCol(`date), 0, sqlCol(`date),0);

< select avg(PRC) as avg_PRC from t1 where name == "MSFT",vol > x context by date csort date desc >


sql(sqlColAlias(<avg(PRC)>), t1, whereConditions, sqlCol(`date), 0, , ,havingCondition);

< select avg(PRC) as avg_PRC from t1 where name == "MSFT",vol > x context by date having count(date) > 3 >


sql(sqlColAlias(<avg(PRC)>), t1, whereConditions,,,,,,sqlCol(`date));

< select avg(PRC) as avg_PRC from t1 where name == "MSFT",vol > x order by date asc >


sql(sqlColAlias(<avg(PRC)>), t1, whereConditions,,,,,,sqlCol(`date),0);

< select avg(PRC) as avg_PRC from t1 where name == "MSFT",vol > x order by date desc >

// when sortOrder is set as 0, it means sorting in descending order.



我们可以定义一个函数使用sql函数来生成SQL语句。当调用函数时,SQL语句会被执行。生成复杂的查询将会变得方便灵活。



def f1(t, sym, x){

whereConditions=[<name=sym>,<vol>x>]

return sql(sqlCol("*"),t,whereConditions).eval()

};


f1(t1, `MSFT, 7000);

name date       PRC   vol

---- ---------- ----- ----

MSFT 2017.01.03 63.12 8800

MSFT 2017.01.03 62.58 7800


f1(t1, `F, 9000);

name date       PRC   vol

---- ---------- ----- ----

F    2017.01.04 13.17 9600



def f2(t, sym, colNames, filterColumn, filterValue){

whereConditions=[<name=sym>,expr(sqlCol(filterColumn),>,filterValue)]

return sql(sqlCol(colNames),t,whereConditions).eval()

};

f2(t1,`MSFT, `name`date`vol, `vol, 7000);

name date       vol

---- ---------- ----

MSFT 2017.01.03 8800

MSFT 2017.01.03 7800


f2(t1,`F, `name`date`vol,`PRC,13.2);

name date       vol

---- ---------- ----

F    2017.01.04 8900

F    2017.01.04 2300

F    2017.01.04 6300