mysql窗口函数(over()、排序函数、with语句)

窗口函数:

seleect 聚合函数 over(partition by_______ order by ________)from table;

基本语法:

<window_function>over(…)

优点:

    简单 窗口函数更易于使用。在上面的示例中,与使用聚合函数然后合并结果相比,使用窗口函数仅需要多一行就可以获得所需要的结果。 快速 这一点与上一点相关,使用窗口函数比使用替代方法要快得多。当你处理成百上千个千兆字节的数据时,这非常有用。 多功能性 最重要的是,窗口函数具有多种功能,比如,添加移动平均线,添加行号和滞后数据,等等。

over子句基础用法:

over():

SELECT
  first_name,
  last_name,
  salary,  
  AVG(salary) OVER()
FROM employee;

需要注意:窗口函数在WHERE 子句后执行!

小结:

    可以使用<window_function> OVER(),对全部查询结果进行聚合计算 在WHERE条件执行之后,才会执行窗口函数 窗口函数在执行聚合计算的同时还可以保留每行的其它原始信息 不能在WHERE子句中使用窗口函数

over(partition by)的使用:

基本语法:

<window_function> OVER (PARTITION BY column1, column2 … column_n)

partition by与order by的区别:

① group by是分组函数,partition by是分析函数

② 在执行顺序上:from > where > group by > having > order by,而partition by应用在以上关键字之后, 可以简单理解为就是在执行完select之后,在所得结果集之上进行partition by分组

③ partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序(类 似excel中的操作),而group by则只保留参与分组的字段和聚合函数的结果

(类似excel中的pivot透视表)

SELECT
  id,
  model,
  first_class_places,
  SUM(first_class_places) OVER (PARTITION BY model)
FROM train;

排序函数:

基本语法:

RANK() OVER (ORDER BY …)

与oredr by的区别:

    RANK()会返回每一行的等级(序号) ORDER BY对行进行排序将数据按升序或降序排列 RANK()OVER(ORDER BY ...)是一个函数,与ORDER BY 配合返回序号

rank():

SELECT
  name,
  genre,
  updated,
  RANK() OVER(ORDER BY updated) as date_rank
FROM game;

DENSE_RANK():

SELECT
  name,
  platform,
  editor_rating,
  DENSE_RANK() OVER(ORDER BY editor_rating) as rank_
FROM game;

ROW_NUMBER():

SELECT
  name,
  platform,
  editor_rating,
  ROW_NUMBER() OVER(ORDER BY editor_rating) `row_number`
FROM game;

NTILE(x):

NTILE(X)函数将数据分成X组,并给每组分配一个数字(1,2,3…),例如:

SELECT
  name,
  genre,
  editor_rating,
  NTILE(3) OVER (ORDER BY editor_rating DESC)
FROM game;

with语句:

WITH ranking AS
  (SELECT
    RANK() OVER (ORDER BY col2) AS RANK,
    col1
  FROM table_name)

SELECT col1
FROM ranking
WHERE RANK = place1;
经验分享 程序员 微信小程序 职场和发展