1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| select name,count(*) over() from test1 where substring(orderdate, 1, 7) = '2017-04' group by name; // 会开两次窗,group by进行了去重 > 结果 mart 2 jack 2
select name,count(*) over() from test1 where substring(orderdate, 1, 7) = '2017-04'; // 有几个name 就会开几个窗(5个) > 结果 mart 5 mart 5 mart 5 mart 5 jack 5
select orderdate,sum(cost) over(order by orderdate) from test1; // over() 中限制了窗口的大小,此时窗口的大小是根据 orderdate来判断,又因为 orderdate 进行了order by ,所以第一次开窗是最小的orderdate,逐步变大,sum() 中拿到的值也逐渐变多(窗口逐渐变大),直到最后一个orderdate,窗口数据集就是整个数据集。
select name, orderdate,cost,sum(cost) over(distribute by name) from test1; // distribute => 作用和group by 类似,可以起到分组去重的作用,over() 中不能使用 group by
select name, orderdate,cost,sum(cost) over(distribute by name sort by orderdate) from test1; select name, orderdate,cost,sum(cost) over(prtition by name order by orderdate) from test1; // sort by 和 order by 排序 order by 针对的是整体,sort by针对的是分组(分区)内的数据 distribute by 和 sort by 一般是连用, partition by 和 oreder by 连用
select name,orderdate,cost,lag(orderdate, 1) over(partition by name order by orderdate) from test1; // lag(col, n) 是找到col类的前面第几行,针对上面的sql语句,每次找到的都是当前行的前面一行 lag() 会受到分区的阻挡,如果同时用到LAG() 和 LEAD() 需要在每个后面都跟上 over() ,因为over 只对它前面的一个聚合函数提供内容
|