排序类窗口函数

  1. select *,
  2. rank() over (partition by 班级
  3. order by 成绩 desc) as ranking
  4. from 班级表
select *,
   rank() over (order by 成绩 desc) as ranking,# 12225
   dense_rank() over (order by 成绩 desc) as dese_rank,# 12223
   row_number() over (order by 成绩 desc) as row_num # 12345
from 班级表

聚合类窗口函数

SUM、AVG、COUNT、MAX、MIN等

select sid,sum(score) over(partition by sid  order by score) current_sum
from sc

# 加order by会进行累行计算

偏移类窗口函数

偏移函数
lag(字段名,行数) 取出当前行前面第n行数据
lead (字段名,行数) 取出当前行后面第n行数据

# 创建一张销售记录表
CREATE TABLE sales_record  (
  shopid varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  dt date NULL DEFAULT NULL,
  sale int(0) NULL DEFAULT NULL
);

# 插入数据
INSERT INTO sales_record VALUES ('A', '2017-10-11', 300);
INSERT INTO sales_record VALUES ('A', '2017-10-12', 200);
INSERT INTO sales_record VALUES ('A', '2017-10-13', 100);
INSERT INTO sales_record VALUES ('A', '2017-10-15', 100);
INSERT INTO sales_record VALUES ('A', '2017-10-16', 300);
INSERT INTO sales_record VALUES ('A', '2017-10-17', 150);
INSERT INTO sales_record VALUES ('A', '2017-10-18', 340);
INSERT INTO sales_record VALUES ('A', '2017-10-19', 360);
INSERT INTO sales_record VALUES ('B', '2017-10-11', 400);
INSERT INTO sales_record VALUES ('B', '2017-10-12', 200);
INSERT INTO sales_record VALUES ('B', '2017-10-15', 600);
INSERT INTO sales_record VALUES ('C', '2017-10-11', 350);
INSERT INTO sales_record VALUES ('C', '2017-10-13', 250);
INSERT INTO sales_record VALUES ('C', '2017-10-14', 300);
INSERT INTO sales_record VALUES ('C', '2017-10-15', 400);
INSERT INTO sales_record VALUES ('C', '2017-10-16', 200);
INSERT INTO sales_record VALUES ('D', '2017-10-13', 500);
INSERT INTO sales_record VALUES ('E', '2017-10-14', 600);
INSERT INTO sales_record VALUES ('E', '2017-10-15', 500);
INSERT INTO sales_record VALUES ('D', '2017-10-14', 600);

问题:请求出 table sales_record 表中连续三天有销售记录的店铺

select 
  distinct 
  shopid
from (select 
        shopid,
        t.dt,
        t.第三次有销售记录的日期,
        datediff(t.第三次有销售记录的日期,dt)+1 as date_diff
      from (select 
            shopid,
            dt,
            lead(dt,2) over(partition by shopid order by dt asc) as 第三次有销售记录的日期
            from sales_record
           ) t 
     ) t1
where t1.date_diff=3