在这里,我们将给大家分享关于ORACLE中的ROW_NUMBER()OVER()分析函数的用法的知识,让您更了解oracleover分析函数详解的本质,同时也会涉及到如何更有效地hive分组排序函数r
在这里,我们将给大家分享关于ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法的知识,让您更了解oracleover 分析函数详解的本质,同时也会涉及到如何更有效地hive 分组排序函数 row_number() over(partition by " " order by " "desc、HiveSQL——row_number() over() 使用、MYSQL - 实现 sqlserver- row_number () over (partition by order by) 分组排序功能、mysql row_number() over()的内容。
本文目录一览:- ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法(oracleover 分析函数详解)
- hive 分组排序函数 row_number() over(partition by " " order by " "desc
- HiveSQL——row_number() over() 使用
- MYSQL - 实现 sqlserver- row_number () over (partition by order by) 分组排序功能
- mysql row_number() over()
ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法(oracleover 分析函数详解)
Oracle 中的 ROW_NUMBER() OVER() 分析函数的用法
ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)。
举例:
SQL> DESC T1;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(10)
DATE1 DATE
SQL> SELECT * FROM T1;
ID NAME DATE1
---------- ------------------------------ ------------------
101 aaa 09-SEP-13
101 bbb 10-SEP-13
101 ccc 11-SEP-13
102 ddd 08-SEP-13
102 eee 11-SEP-13
SQL> SELECT ID,NAME,DATE1,ROW_NUMBER() OVER(partition by ID order by DATE1 desc) as RN FROM T1;
ID NAME DATE1 RN
---------- ------------------------------ ------------------ ----------
101 ccc 11-SEP-13 1
101 bbb 10-SEP-13 2
101 aaa 09-SEP-13 3
102 eee 11-SEP-13 1
102 ddd 08-SEP-13 2
把上面语句作为一个子表语句,嵌入到另一条语句中:
SQL> SELECT ID,NAME,DATE1 FROM (SELECT ID,NAME,DATE1,ROW_NUMBER() OVER(partition by ID order by DATE1 desc) as RN FROM T1)T WHERE T.RN=1;
ID NAME DATE1
---------- ------------------------------ ------------------
101 ccc 11-SEP-13
102 eee 11-SEP-13
hive 分组排序函数 row_number() over(partition by " " order by " "desc
语法:row_number() over (partition by 字段a order by 计算项b desc ) rank
--这里rank是别名
partition by:类似hive的建表,分区的意思;
order by :排序,默认是升序,加desc降序;
这里按字段a分区,对计算项b进行降序排序
实例:
要取top10品牌,各品牌的top10渠道,各品牌的top10渠道中各渠道的top10档期
1、取top10品牌
select 品牌,count/sum/其它() as num from table_name order by num limit 10;
2、 取top10品牌下各品牌的top10渠道
select
a.*
from
(
select 品牌,渠道,count/sum/其它() as num row_number() over (partition by 品牌 order by num desc ) rank
from table_name
where 品牌限制条件
group by 品牌,渠道
)a
where
a.rank<=10
3、 取top10品牌下各品牌的top10渠道中各渠道的top10档期
select
a.*
from
(
select 品牌,渠道,档期,count/sum/其它() as num row_number() over (partition by 品牌,渠道 order by num desc ) rank
from table_name
where 品牌,渠道 限制条件
group by 品牌,渠道,档期
)a
where
a.rank<=10
HiveSQL——row_number() over() 使用
语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
row_number() over()分组排序功能:
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行。
例一:
表数据:
create table TEST_ROW_NUMBER_OVER(
id varchar(10) not null,
name varchar(10) null,
age varchar(10) null,
salary int null
);
select * from TEST_ROW_NUMBER_OVER t;
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,''a'',10,8000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(1,''a2'',11,6500);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,''b'',12,13000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(2,''b2'',13,4500);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,''c'',14,3000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(3,''c2'',15,20000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(4,''d'',16,30000);
insert into TEST_ROW_NUMBER_OVER(id,name,age,salary) values(5,''d2'',17,1800);
一次排序:对查询结果进行排序(无分组)
select id,name,age,salary,row_number()over(order by salary desc) rn
from TEST_ROW_NUMBER_OVER t
结果:
进一步排序:根据id分组排序
select id,name,age,salary,row_number()over(partition by id order by salary desc) rank
from TEST_ROW_NUMBER_OVER t
结果:
再一次排序:找出每一组中序号为一的数据
select * from(select id,name,age,salary,row_number()over(partition by id order by salary desc) rank
from TEST_ROW_NUMBER_OVER t)
where rank <2
结果:
排序找出年龄在13岁到16岁数据,按salary排序
select id,name,age,salary,row_number()over(order by salary desc) rank
from TEST_ROW_NUMBER_OVER t where age between ''13'' and ''16''
结果:结果中 rank 的序号,其实就表明了 over(order by salary desc) 是在where age between and 后执行的
例二:
1.使用row_number()函数进行编号,如
select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer
原理:先按psd进行排序,排序完后,给每条数据进行编号。
2.在订单中按价格的升序进行排序,并给每条记录进行排序代码如下:
select DID,customerID,totalPrice,ROW_NUMBER() over(order by totalPrice) as rows from OP_Order
3.统计出每一个各户的所有订单并按每一个客户下的订单的金额 升序排序,同时给每一个客户的订单进行编号。这样就知道每个客户下几单了:
select ROW_NUMBER() over(partition by customerID order by totalPrice)
as rows,customerID,totalPrice, DID from OP_Order
4.统计每一个客户最近下的订单是第几次下的订单:
with tabs as
(
select ROW_NUMBER() over(partition by customerID order by totalPrice)
as rows,customerID,totalPrice, DID from OP_Order
)
select MAX(rows) as ''下单次数'',customerID from tabs
group by customerID
5.统计每一个客户所有的订单中购买的金额最小,而且并统计改订单中,客户是第几次购买的:
思路:利用临时表来执行这一操作。
1.先按客户进行分组,然后按客户的下单的时间进行排序,并进行编号。
2.然后利用子查询查找出每一个客户购买时的最小价格。
3.根据查找出每一个客户的最小价格来查找相应的记录。
with tabs as
(
select ROW_NUMBER() over(partition by customerID order by insDT)
as rows,customerID,totalPrice, DID from OP_Order
)
select * from tabs
where totalPrice in
(
select MIN(totalPrice)from tabs group by customerID
)
6.筛选出客户第一次下的订单。
思路。利用rows=1来查询客户第一次下的订单记录。
with tabs as
(
select ROW_NUMBER() over(partition by customerID order by insDT) as rows,* from OP_Order
)
select * from tabs where rows = 1
select * from OP_Order
7.注意:在使用over等开窗函数时,over里头的分组及排序的执行晚于“where,group by,order by”的执行。
select
ROW_NUMBER() over(partition by customerID order by insDT) as rows,
customerID,totalPrice, DID
from OP_Order where insDT>''2011-07-22''
原文链接:https://blog.csdn.net/qq_25221835/article/details/82762416
MYSQL - 实现 sqlserver- row_number () over (partition by order by) 分组排序功能
sqlserver:
with Result as
(
select SUM(F_DayValue) AS F_Value,F_ZZ_ttBuildID,F_EnergyItemCode
from T_EC_EnergyItemDayResult
where F_EnergyItemCode like ''%000''
and F_StartDay>=@ldStartDate and F_StartDay<=@ldEndDate
and F_ZZ_ttBuildID IN (select F_BuildID from T_BD_BuildBaseInfo)
group by F_ZZ_ttBuildID,F_EnergyItemCode
)
select a.F_Value,a.F_ZZ_ttBuildID,b.F_BuildName,a.F_EnergyItemCode,
ROW_NUMBER() over(partition by a.F_EnergyItemCode order by a.F_Value desc) as nsort
from Result a
left join T_BD_BuildBaseInfo b on a.F_ZZ_ttBuildID=b.F_BuildID
mysql:
CREATE TEMPORARY TABLE IF NOT EXISTS Result
(
select SUM(F_DayValue) AS F_Value,F_ZZ_ttBuildID,F_EnergyItemCode
from T_EC_EnergyItemDayResult
where F_EnergyItemCode like ''%000''
and F_StartDay>=V_ldStartDate and F_StartDay<=V_ldEndDate
and F_ZZ_ttBuildID IN (select F_BuildID from T_BD_BuildBaseInfo)
group by F_ZZ_ttBuildID,F_EnergyItemCode
);
CREATE TEMPORARY TABLE IF NOT EXISTS TMP01
(
select a.F_Value,a.F_ZZ_ttBuildID,b.F_BuildName,a.F_EnergyItemCode
from Result a
left join T_BD_BuildBaseInfo b on a.F_ZZ_ttBuildID=b.F_BuildID
);
select F_Value,F_ZZ_ttBuildID,F_BuildName,F_EnergyItemCode,nsort from (
select heyf_tmp.F_Value,heyf_tmp.F_ZZ_ttBuildID,heyf_tmp.F_BuildName,heyf_tmp.F_EnergyItemCode,@rownum
:=@rownum+1 ,
if(@pdept=heyf_tmp.F_EnergyItemCode,@rank:=@rank+1,@rank:=1) as nsort,
@pdept:=heyf_tmp.F_EnergyItemCode
from (
select F_Value,F_ZZ_ttBuildID,F_BuildName,F_EnergyItemCode from TMP01 order by F_EnergyItemCode ASC
,F_Value desc
) heyf_tmp ,(select @rownum :=0 , @pdept := null ,@rank:=0) a) T;
mysql row_number() over()
select inn.rank from(
select (@rowno\\:=@rowno+1) rank,c.user_id from t_company c,(select @rowno\\:=0) rowno where c.company_id=?
) inn where inn.user_id=?
关于ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法和oracleover 分析函数详解的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于hive 分组排序函数 row_number() over(partition by " " order by " "desc、HiveSQL——row_number() over() 使用、MYSQL - 实现 sqlserver- row_number () over (partition by order by) 分组排序功能、mysql row_number() over()等相关内容,可以在本站寻找。
本文标签: