GVKun编程网logo

SQL 奇技淫巧(01):给查出的数据排序编个号【row_number () over (order by c)】(mysql,db2,oracle,sqlserver 通用)

3

如果您对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 通用)

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

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) 语法吗

@李玉珏 你好,想跟你请教个问题:ignite sql 支持 row_number() over(order by xxx desc) 语法吗?

H2有这个语法,ignite貌似不支持

MYSQL - 实现 sqlserver- row_number () over (partition by order by) 分组排序功能

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()

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()等更多相关知识的信息可以在本站进行查询。

本文标签: