数据库“行专列”操作---使用row_number()over(partition by 分组字段 [order by 排序字段])
测试样例:
create table test(rsrp string,rsrq string,tkey string,distan string);
insert into test values('-90.28','-37','tkey1','');
insert into test values('-92.35','-40','tkey1','');
insert into test values('-94.36','-34','tkey2','');
insert into test values('-93.88','-38','tkey2','');
select * from test;
+------------+------------+------------+--------------+--+
| test.rsrp | test.rsrq | test.tkey | test.distan |
+------------+------------+------------+--------------+--+
| -90.28 | -37 | tkey1 | 10 |
| -92.35 | -40 | tkey1 | 30 |
| -94.36 | -34 | tkey2 | 5 |
| -93.88 | -38 | tkey2 | 19 |
+------------+------------+------------+--------------+--+
select rsrp,rsrq,tkey,distan,row_number()over(partition by tkey order by distan asc) rn
from test
group by rsrp,rsrq,tkey,distan;
+---------+-------+--------+---------+-----+--+
| rsrp | rsrq | tkey | distan | rn |
+---------+-------+--------+---------+-----+--+
| -90.28 | -37 | tkey1 | 10 | 1 |
| -92.35 | -40 | tkey1 | 30 | 2 |
| -93.88 | -38 | tkey2 | 19 | 1 |
| -94.36 | -34 | tkey2 | 5 | 2 |
+---------+-------+--------+---------+-----+--+
新建测试表:
create table grid_test(
buildingid nvarchar(32),
gridid nvarchar(32),
height int,
gridx nvarchar(32),
gridy nvarchar(32),
eci nvarchar(32),
total_num int
)
测试分组
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci1',123)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci1',2)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci1',19)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci1',50)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci1',78)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci2',98)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci2',22)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci2',19)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci2',87)
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci2',78)
--栅格小区分组排序
select buildingid,gridid,height,gridx,gridy,eci,total_num,row_number()over(partition by buildingid,gridid,height,gridx,gridy,eci order by total_num desc) rn
from grid_test
group by buildingid,gridid,height,gridx,gridy,eci,total_num;
buildingid gridid height gridx gridy eci total_num rn
building1 gridid1 1 gridid1 x gridid1 y eci1 123 1
building1 gridid1 1 gridid1 x gridid1 y eci1 78 2
building1 gridid1 1 gridid1 x gridid1 y eci1 50 3
building1 gridid1 1 gridid1 x gridid1 y eci1 19 4
building1 gridid1 1 gridid1 x gridid1 y eci1 2 5
building1 gridid1 1 gridid1 x gridid1 y eci2 98 1
building1 gridid1 1 gridid1 x gridid1 y eci2 87 2
building1 gridid1 1 gridid1 x gridid1 y eci2 78 3
building1 gridid1 1 gridid1 x gridid1 y eci2 22 4
building1 gridid1 1 gridid1 x gridid1 y eci2 19 5
--栅格分组排序
select buildingid,gridid,height,gridx,gridy,eci,total_num,row_number()over(partition by buildingid,gridid,height,gridx,gridy order by total_num desc) rn
from grid_test
group by buildingid,gridid,height,gridx,gridy,eci,total_num
buildingid gridid height gridx gridy eci total_num rn
building1 gridid1 1 gridid1 x gridid1 y eci1 123 1
building1 gridid1 1 gridid1 x gridid1 y eci2 98 2
building1 gridid1 1 gridid1 x gridid1 y eci2 87 3
building1 gridid1 1 gridid1 x gridid1 y eci1 78 4
building1 gridid1 1 gridid1 x gridid1 y eci2 78 5
building1 gridid1 1 gridid1 x gridid1 y eci1 50 6
building1 gridid1 1 gridid1 x gridid1 y eci2 22 7
building1 gridid1 1 gridid1 x gridid1 y eci1 19 8
building1 gridid1 1 gridid1 x gridid1 y eci2 19 9
building1 gridid1 1 gridid1 x gridid1 y eci1 2 10
行专列:
truncate table grid_test;
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci10',123);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci11',2);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci12',19);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci13',50);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci14',78);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci21',98);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci22',22);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci23',19);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci24',87);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci25',78); select buildingid,gridid,height,gridx,gridy,eci,total_num,row_number()over(partition by buildingid,gridid,height,gridx,gridy order by total_num desc) rn
from grid_test
group by buildingid,gridid,height,gridx,gridy,eci,total_num buildingid gridid height gridx gridy eci total_num rn
building1 gridid1 1 gridid1 x gridid1 y eci10 123 1
building1 gridid1 1 gridid1 x gridid1 y eci14 78 2
building1 gridid1 1 gridid1 x gridid1 y eci13 50 3
building1 gridid1 1 gridid1 x gridid1 y eci12 19 4
building1 gridid1 1 gridid1 x gridid1 y eci11 2 5
building1 gridid2 1 gridid2 x gridid2 y eci21 98 1
building1 gridid2 1 gridid2 x gridid2 y eci24 87 2
building1 gridid2 1 gridid2 x gridid2 y eci25 78 3
building1 gridid2 1 gridid2 x gridid2 y eci22 22 4
building1 gridid2 1 gridid2 x gridid2 y eci23 19 5 select * from (
select buildingid,gridid,height,gridx,gridy,eci,total_num,row_number()over(partition by buildingid,gridid,height,gridx,gridy order by total_num desc) rn
from grid_test
group by buildingid,gridid,height,gridx,gridy,eci,total_num
) t10
where rn<=3
buildingid gridid height gridx gridy eci total_num rn
building1 gridid1 1 gridid1 x gridid1 y eci10 123 1
building1 gridid1 1 gridid1 x gridid1 y eci14 78 2
building1 gridid1 1 gridid1 x gridid1 y eci13 50 3
building1 gridid2 1 gridid2 x gridid2 y eci21 98 1
building1 gridid2 1 gridid2 x gridid2 y eci24 87 2
building1 gridid2 1 gridid2 x gridid2 y eci25 78 3 truncate table grid_test;
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci10',123);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci11',2);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci12',19);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci12',19);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci13',50);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci14',78);
insert into grid_test values('building1','gridid1',1,'gridid1 x','gridid1 y','eci14',78);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci21',98);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci22',22);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci23',19);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci24',87);
insert into grid_test values('building1','gridid2',1,'gridid2 x','gridid2 y','eci25',78); select t10.buildingid,t10.gridid,t10.height,t10.gridx,t10.gridy,
t10.cell1,t10.cell1_mrcount,
t11.cell2,t11.cell2_mrcount,
t12.cell3,t12.cell3_mrcount
from
(
select buildingid,gridid,height,gridx,gridy,eci as cell1,total_num cell1_mrcount from
(
select * from
(
select buildingid,gridid,height,gridx,gridy,eci,total_num,row_number()over(partition by buildingid,gridid,height,gridx,gridy order by total_num desc) rn
from grid_test
group by buildingid,gridid,height,gridx,gridy,eci,total_num
) t10
where rn<=3
) t where rn=1
) t10
inner join
(
select buildingid,gridid,height,gridx,gridy,eci as cell2,total_num cell2_mrcount from (
select * from (
select buildingid,gridid,height,gridx,gridy,eci,total_num,row_number()over(partition by buildingid,gridid,height,gridx,gridy order by total_num desc) rn
from grid_test
group by buildingid,gridid,height,gridx,gridy,eci,total_num
) t10
where rn<=3
) t where rn=2
) t11 on t10.gridid=t11.gridid and t10.height=t11.height
inner join
(
select buildingid,gridid,height,gridx,gridy,eci as cell3,total_num cell3_mrcount from (
select * from (
select buildingid,gridid,height,gridx,gridy,eci,total_num,row_number()over(partition by buildingid,gridid,height,gridx,gridy order by total_num desc) rn
from grid_test
group by buildingid,gridid,height,gridx,gridy,eci,total_num
) t10
where rn<=3
) t where rn=3
) t12 on t10.gridid=t12.gridid and t10.height=t12.height buildingid gridid height gridx gridy cell1 cell1_mrcount cell2 cell2_mrcount cell3 cell3_mrcount
building1 gridid1 1 gridid1 x gridid1 y eci10 123 eci14 78 eci13 50
building1 gridid2 1 gridid2 x gridid2 y eci21 98 eci24 87 eci25 78
数据库“行专列”操作---使用row_number()over(partition by 分组字段 [order by 排序字段])的更多相关文章
- hive:数据库“行专列”操作---使用collect_set/collect_list/collect_all & row_number()over(partition by 分组字段 [order by 排序字段])
方案一:请参考<数据库“行专列”操作---使用row_number()over(partition by 分组字段 [order by 排序字段])>,该方案是sqlserver,orac ...
- 去重 ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段) RN
关键字 ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段) RN 按照分组字段进行排序并标编号 ROW_NUMBER() OVER(PARTITIO ...
- 【SQL】ROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例
#用法说明 select row_number() over(partition by A order by B ) as rowIndex from table A :为分组字段 B:为分组后的排序 ...
- oracle ROW_NUMBER() OVER(PARTITION BY '分组' ORDER BY '排序' DESC) 用法
转载:https://blog.csdn.net/dbagaoshou/article/details/51330829 SELECT * FROM ( SELECT ROW_NUMBER() OVE ...
- SELECT a.loginname,a.deviceid,a.time,Row_Number() OVER (partition by a.loginname ORDER BY a.deviceid desc,a.time asc) rank
现在做一个反欺诈内容要用到笛卡尔积,用来分析用户一个手机号,对应的多个设备,每个更换设备的时间,这里取的时间是系统收集时间,用来代表更换的时间, 所以要先对设备换的时间作排序,然后进行rank,最后求 ...
- row_number() over partition by 分组聚合
分组聚合,就是先分组再排序,可以的话顺手标个排名:如果不想分组也可以排名:如果不想分组同时再去重排名也可以 ROW_NUMBER() OVER( [PARTITION BY column_1, col ...
- sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据
SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...
- row_number和partition by分组取top数据
分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...
- MYSQL-实现分组排序 对比 ORACLE 和SQLserver用 row_number() over(partition by ) 分组排序功能
以下是个人笔记: 本文是为了理解 row_number() over(partition by ) 和实现各种数据库的分组排序功能 select ROW_NUMBER()over( partitio ...
随机推荐
- 新装的Linux服务系统安装MySQL
目的描述:全新的腾讯云Linux服务器,系统是ubuntu 16.04.需要在上面安装mysql数据库. 使用XShell远程登录,在终端窗口中使用sudo apt-get 指令在线安装mysql. ...
- STL --> queue单向队列
queue单向队列 queue 模板类的定义在<queue>头文件中.与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器 ...
- postman简单教程-环境变量,全局变量的设置及作用
讲postman环境变量设置之前,先讲一个小插曲,环境变量.全局变量的区别在于Globals,只能用一组,而Environmen可以设置多组,所以我更喜欢设置环境变量 1.环境变量-Environme ...
- Oracle查询优化改写--------------------给查询结果排序
一.查看员工所雇员工信息(查询部门号==10并且按照入职时间升序排序.第二种用数字来代替) 二.按多个字段排序(dmpno,deptno,sal,ename,job) 三.按照子串排序(有一种速查方法 ...
- 基于 IJKPlayer-concat 协议的视频无缝拼接技术实现
一.前言 Hi,大家好,我是承香墨影! 开门见山,开篇名义.今天来聊聊如何将多段视频,拼接成一个完整而连续的视频,然后无缝进行播放. 这样的需求应该不算偏门吧? 最简单的就是一些视频 App,会将大段 ...
- Dynamics 365 for CRM:修改ADFS的过期时间,TokenLifetime
通过Microsoft PowerShell修改ADFS的过期时间实现延长CRM的过期时间 To change the timeout value, you will need to update t ...
- Java 并发基础——线程安全性
当线程安全:多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类都能表现出正确的行为,那么久称这个类是线程安全的. 在线程 ...
- 关于hbase中的hbase-site.xml 配置详解
该文档是用Hbase默认配置文件生成的,文件源是 hbase-default.xml hbase.rootdir 这个目录是region server的共享目录,用来持久化HBase.URL需要是'完 ...
- 201621123062《java程序设计》第八周作业总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 思维导图: 2. 书面作业 2.1ArrayList代码分析 2.1.1 解释ArrayList的contains源代码 源 ...
- QTableView
QTableView常用于实现数据的表格显示.下面我们如何按步骤实现学生信息表格: 一 添加表头 //准备数据模型 QStandardItemModel *student_model = ne ...