Leetcode SQL精选题(一)

117 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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