博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
row_number() over partition by 分组聚合
阅读量:5026 次
发布时间:2019-06-12

本文共 2298 字,大约阅读时间需要 7 分钟。

分组聚合,就是先分组再排序,可以的话顺手标个排名;如果不想分组也可以排名;如果不想分组同时再去重排名也可以

ROW_NUMBER() OVER(    [PARTITION BY column_1, column_2,…]    [ORDER BY column_3,column_4,…])

Oracle和SQL server的关键字是over partition by

mysql的无关键字

Oracle和sqlserver

最终效果:

例子:

-- 建表USE db_03;DROP TABLE IF EXISTS employee;create table employee (empid int ,deptid int ,salary decimal(10,2));insert into employee values(1,10,5500.00);insert into employee values(2,10,4500.00);insert into employee values(3,20,1900.00);insert into employee values(4,20,4800.00);insert into employee values(5,40,6500.00);insert into employee values(6,40,14500.00);insert into employee values(7,40,44500.00);insert into employee values(8,50,6500.00);insert into employee values(9,50,7500.00);SELECT * FROM employee;

SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

结果:

如果不要分组,就仅仅order by 的话

需求:给username加上唯一标示id

背景:需要一个纬度表,里面有仅仅username的唯一标示,因为hive中不存在自增id

select distinct     price,    row_number() over (order by price)from    productsorder by     price;
price  | row_number---------+------------  300.00 |          1  300.00 |          2  400.00 |          3  500.00 |          4  600.00 |          5  600.00 |          6  700.00 |          7  800.00 |          8  800.00 |          9  900.00 |         10 1100.00 |         11

需求同上,如果需要去重的话(distinct)

with prices as (    select distinct        price    from         products)select price,row_numer()over(order by price) from prices;
price  | row_number---------+------------  300.00 |          1  400.00 |          2  500.00 |          3  600.00 |          4  700.00 |          5  800.00 |          6  900.00 |          7 1100.00 |          8

mysql

因为不能使用这个关键字,所以配合其他关键字使用

预期效果

select deptid,salaryfrom employee awhere 2 > (select count(1)from employee bwhere a.salary

但是有弊端,如果最大值有多个,那么就会出现多个最大值,so,要动态的

SET @row=0;SET @groupid='';select a.deptid,a.salaryfrom(select deptid,salary,case when @groupid=deptid then @row:=@row+1 else @row:=1 end rownum,@groupid:=deptid from employeeorder by deptid,salary desc)awhere a.rownum<=2;

mysql还有其他写法,通过求出极值再进行关联

SELECT t.stuid,          t.stuname,          t.score,          t.classid  FROM stugrade t  where t.score = (SELECT max(tmp.score) from stugrade tmp where tmp.classid=t.classid)

转载于:https://www.cnblogs.com/starzy/p/11146156.html

你可能感兴趣的文章
如何判断链表是否有环
查看>>
【小程序】缓存
查看>>
ssh无密码登陆屌丝指南
查看>>
MySQL锁之三:MySQL的共享锁与排它锁编码演示
查看>>
docker常用命令详解
查看>>
jQuery技巧大放送
查看>>
字符串转换成JSON的三种方式
查看>>
Hive时间函数笔记
查看>>
clojure-emacs-autocomplete
查看>>
一个自己写的判断2个相同对象的属性值差异的工具类
查看>>
10 华电内部文档搜索系统 search03
查看>>
[HIHO1149]回文字符序列(dp)
查看>>
[HDU1402]A * B Problem Plus(FFT)
查看>>
[CF803C] Maximal GCD(gcd,贪心,构造)
查看>>
逆时针旋转的矩阵变换
查看>>
第10周15/16/17
查看>>
【数据库】SQL两表之间:根据一个表的字段更新另一个表的字段
查看>>
四六级作文常见错误解析(转载)
查看>>
Tomcat
查看>>
./是当前目录 ../是当前的上一级目录。上上级就是../../一般绝对路径时候常用...
查看>>