如果您对SQL奇技淫巧感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于SQL奇技淫巧的详细内容,我们还将为您解答01:给查出的数据排序编个号【row_number()over
如果您对SQL 奇技淫巧感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于SQL 奇技淫巧的详细内容,我们还将为您解答01:给查出的数据排序编个号【row_number () over (order by c)】的相关问题,并且为您提供关于hive 分组排序函数 row_number() over(partition by " " order by " "desc、ignite sql 支持 row_number() over(order by xxx desc) 语法吗、MYSQL - 实现 sqlserver- row_number () over (partition by order by) 分组排序功能、mysql row_number() over()的有价值信息。
本文目录一览:- SQL 奇技淫巧(01):给查出的数据排序编个号【row_number () over (order by c)】(mysql,db2,oracle,sqlserver 通用)
- hive 分组排序函数 row_number() over(partition by " " order by " "desc
- ignite sql 支持 row_number() over(order by xxx desc) 语法吗
- MYSQL - 实现 sqlserver- row_number () over (partition by order by) 分组排序功能
- mysql row_number() over()
SQL 奇技淫巧(01):给查出的数据排序编个号【row_number () over (order by c)】(mysql,db2,oracle,sqlserver 通用)
我们天天都在跟数据库打交道,写下的代码不计其数,写下的 SQL 更是可以绕地球几圈。这里收集关于 SQL 的神奇语法及用法,虽然你可能没有用过,但这些 SQL 却可以在关键的时候,派上用场。
我对 SQL 语句的理解,可以比作一座桥梁,将零散的数据组合起来,拿到我所需要的有效信息。也以此记录一下使用心得
一。语法及基础用法
注意: row_number ()不能单独使用,需要和 over (order by col) 一起使用。 ##### 语法 1: row_number() over(ORDER BY col)
意思:简单的说 row_number () 从 1 开始,为每一条分组记录返回一个数字,这里的 ROW_NUMBER () OVER (ORDER BY xlh DESC) 是先把 xlh 列降序,再为降序以后的每条 xlh 记录返回一个序号。
##### 语法 2: row_number() over(PARTITION BY col1 ORDER BY col2)
意思:表示根据 col1 分组,在分组内部根据 col2 排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
关于 Parttion by:
Parttion by 关键字是 SQL 中分析性函数的一部分,用于给结果集进行分区。它和聚合函数 Group by 不同的地方在于它只是将原始数据进行名次排列,能够返回一个分组中的多条记录(记录数不变),而 Group by 是对原始数据进行聚合统计,一般只有一条反映统计值的结果(每组返回一条)。
Parttion by 后面如果想按多个字段分组,则以逗号分隔。
row_number() over(PARTITION BY col1,col3,col4 ORDER BY col2)
实例:
(1) 建表造数据:
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);
数据显示为:
(2) 需求:根据部门分组,显示每个部门的工资等级
sql:
SELECT *,
row_number() over(PARTITION by deptid ORDER BY salary desc) as score
FROM
employee
预期结果:
二。真实案例
通过上面基础语法和使用,我们也只是简单地知道 row_number () 可以用来编号排序使用,以及分组内排序两种情景。通过对其有一个了解之后,你的心中充满疑问, 如果对于在项目中,我们又可以拿它来做什么,又可以解决什么样的问题。
这个语法也是我最近工作内容的时候,才接触到的,之前也只是模模糊糊地停留在知道有这个,而在工作中没实际用过它。
上面介绍的是在单表中的一个操作,那么对于稍微复杂的多表关联操作是否有考虑过
下面举个贴近身边的实例来学习一下 SQL 用法:
左连接表中可能有多条数据满足情况,但只取满足条件中的第一条,即取 max 自关联的查询数据
select
a.*, b.*
from
girl g,
(select *, row_number() over(ORDER BY like desc) as rn from boy) b
where b.rn = 1 and g.like = b.like
上面的意思:girl 表和 boy 表关联,让 girl 找到最喜欢的那个 boy;boy 表是根据喜好值排序。
这样就可以用上它了。
三。总结
row_number () 的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用 row_number 函数时必须要用 over 子句选择对某一列进行排序才能生成序号。
同时,在使用排名函数的时候需要注意以下三点:
-
1、排名函数必须有 OVER 子句。
-
2、排名函数必须有包含 ORDER BY 的 OVER 子句。
-
3、分组内从 1 开始排序。
这个方法的多数据库兼容性也是很好的,如果你要与数据库打交道,也请收藏好它。
原文出处:https://www.cnblogs.com/werewolfBoy/p/11429973.html
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
ignite sql 支持 row_number() over(order by xxx desc) 语法吗
@李玉珏 你好,想跟你请教个问题:ignite sql 支持 row_number() over(order by xxx desc) 语法吗?
H2有这个语法,ignite貌似不支持
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=?
今天关于SQL 奇技淫巧和01:给查出的数据排序编个号【row_number () over (order by c)】的介绍到此结束,谢谢您的阅读,有关hive 分组排序函数 row_number() over(partition by " " order by " "desc、ignite sql 支持 row_number() over(order by xxx desc) 语法吗、MYSQL - 实现 sqlserver- row_number () over (partition by order by) 分组排序功能、mysql row_number() over()等更多相关知识的信息可以在本站进行查询。
本文标签: