本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.多重查询
select
player_id,device_id
from Activity
where (player_id,event_date) in
(select player_id,min(event_date) from Activity
group by player_id)
注意!在in后面的括号里不要使用聚合函数,应当用group by可以实现
2.聚合函数
如果只有over(),就是替代group by的作用。没有这个over()子查询的结果就是聚合的。 如果只有sum(),没有over(),那只会显示最后一行的结果
1.第一个参数是 partition by +分组字段,****用于分割!!
将数据根据此字段分成多份,如果不加partition by参数,那会把整个数据当做一个窗口。
2.第二个参数是 order by +排序字段,每个窗口的数据要不要进行排序。如果做了排序,就代表对排序之前所有的值做了一个窗口进行统计!!!
3.第三个参数 rows/range between 起始位置 and 结束位置,这个参数仅针对滑动窗口函数有用,是在当前窗口下分出更小的子窗口。
其中起始位置和结束位置可写:
rows between …… and ……
unbounded preceding 前面所有行
unbounded following 后面所有行
current row 当前行
n following 后面n行
n preceding 前面n行
但是你不能单独使用following!!!(preceding可以单独):一下是解决方案
-- 将当前记录的前后行作为汇总对象
-- 将前设置为0,后设置为2
-- 结果包含自己和后两行的记录
SELECT product_id, product_name, sale_price,
AVG(sale_price) OVER (ORDER BY product_id
ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING
) AS moving_avg
FROM Product;
具体可以看看这篇文章blog.csdn.net/weixin_4057…
ROWS:
是按物理行来进行窗口级别里再次进行范围选择的。
RANGE:
是按逻辑行来进行窗口级别里再次进行范围选择的。RANGE时,相同行会被合并成同一条数据再进行计算,相同行窗口计算时的结果也是相同的。
是否是相同行,是根据ORDER BY排序时的结果决定的。
order by
1.有ORDER BY时:同行是说在ORDER BY排序时不唯一的行。【即具有相同数值的行】
不同行是说ORDER BY排序时具有不同的数值的行。
2.没有ORDER BY:那么就是当前分区的所有行都包含在框架中,因为所有行都会成为当前行的相同行。【特别要注意最后一句的意思】
order by详细
如:select id, dept, salary, min(salary) over(partition by dept) min_sal from dept; -- ①
select id, dept, salary, min(salary) over(partition by dept order by id) min_sal from dept; -- ②
上面①②中的min_salary字段的值会不一样,原因是②中使用order by后,
等同于 min(salary) over(partition by dept order by userid range between unbounded preceding and current row ),
当然可以在order by后使用框架子句,即rows,range等,如果没有写框架子句,就默认在窗口范围中当前行到之前所有行的数据进行统计。
mysql> select *,rank() over (order by grade desc) as ranking,
dense_rank() over (order by grade desc) as dense_ranking,
row_number() over (order by grade desc) as row_num from class