天道酬勤,学无止境

oracle中的RANK()和DENSE_RANK()函数有什么区别?(What's the difference between RANK() and DENSE_RANK() functions in oracle?)

问题

RANK()DENSE_RANK()函数之间有什么区别? 如何在下面的emptbl表中找出第n个薪水?

DEPTNO  EMPNAME    SAL
------------------------------
10       rrr    10000.00
11       nnn    20000.00
11       mmm    5000.00
12       kkk    30000.00
10       fff    40000.00
10       ddd    40000.00
10       bbb    50000.00
10       ccc    50000.00

如果表中的数据为nulls ,如果我想找出nth薪水会怎样?

回答1

RANK为您提供有序分区内的排名。 领带被分配相同的等级,而下一个等级被跳过。 因此,如果您在第2级有3个项目,则列出的下一个级别将是第5级。

DENSE_RANK再次为您提供了有序分区中的排名,但是这些排名是连续的。 如果存在包含多个项目的等级,则不会跳过任何等级。

至于空值,则取决于ORDER BY子句。 这是一个简单的测试脚本,您可以使用它来查看会发生什么:

with q as (
select 10 deptno, 'rrr' empname, 10000.00 sal from dual union all
select 11, 'nnn', 20000.00 from dual union all
select 11, 'mmm', 5000.00 from dual union all
select 12, 'kkk', 30000 from dual union all
select 10, 'fff', 40000 from dual union all
select 10, 'ddd', 40000 from dual union all
select 10, 'bbb', 50000 from dual union all
select 10, 'xxx', null from dual union all
select 10, 'ccc', 50000 from dual)
select empname, deptno, sal
     , rank() over (partition by deptno order by sal nulls first) r
     , dense_rank() over (partition by deptno order by sal nulls first) dr1
     , dense_rank() over (partition by deptno order by sal nulls last) dr2
 from q; 

EMP     DEPTNO        SAL          R        DR1        DR2
--- ---------- ---------- ---------- ---------- ----------
xxx         10                     1          1          4
rrr         10      10000          2          2          1
fff         10      40000          3          3          2
ddd         10      40000          3          3          2
ccc         10      50000          5          4          3
bbb         10      50000          5          4          3
mmm         11       5000          1          1          1
nnn         11      20000          2          2          2
kkk         12      30000          1          1          1

9 rows selected.

这里是一个很好的解释和一些例子的链接。

回答2

这篇文章很好地解释了它。 本质上,您可以这样看:

CREATE TABLE t AS
SELECT 'a' v FROM dual UNION ALL
SELECT 'a'   FROM dual UNION ALL
SELECT 'a'   FROM dual UNION ALL
SELECT 'b'   FROM dual UNION ALL
SELECT 'c'   FROM dual UNION ALL
SELECT 'c'   FROM dual UNION ALL
SELECT 'd'   FROM dual UNION ALL
SELECT 'e'   FROM dual;

SELECT
  v,
  ROW_NUMBER() OVER (ORDER BY v) row_number,
  RANK()       OVER (ORDER BY v) rank,
  DENSE_RANK() OVER (ORDER BY v) dense_rank
FROM t
ORDER BY v;

上面将产生:

+---+------------+------+------------+
| V | ROW_NUMBER | RANK | DENSE_RANK |
+---+------------+------+------------+
| a |          1 |    1 |          1 |
| a |          2 |    1 |          1 |
| a |          3 |    1 |          1 |
| b |          4 |    4 |          2 |
| c |          5 |    5 |          3 |
| c |          6 |    5 |          3 |
| d |          7 |    7 |          4 |
| e |          8 |    8 |          5 |
+---+------------+------+------------+

用文字

  • ROW_NUMBER()为每一行赋予唯一值
  • RANK()将相同的行号赋予相同的值,从而留下“漏洞”
  • DENSE_RANK()将相同的行号赋予相同的值,不留“空洞”
回答3

rank() :用于对一组行中的记录进行排名。

density_rank() :DENSE_RANK函数的作用类似于RANK函数,只是它分配连续的等级。

询问 -

select 
    ENAME,SAL,RANK() over (order by SAL) RANK
from 
    EMP;

输出 -

+--------+------+------+
| ENAME  | SAL  | RANK |
+--------+------+------+
| SMITH  |  800 |    1 |
| JAMES  |  950 |    2 |
| ADAMS  | 1100 |    3 |
| MARTIN | 1250 |    4 |
| WARD   | 1250 |    4 |
| TURNER | 1500 |    6 |
+--------+------+------+

询问 -

select 
    ENAME,SAL,dense_rank() over (order by SAL) DEN_RANK
from 
    EMP;

输出 -

+--------+------+-----------+
| ENAME  | SAL  |  DEN_RANK |
+--------+------+-----------+
| SMITH  |  800 |         1 |
| JAMES  |  950 |         2 |
| ADAMS  | 1100 |         3 |
| MARTIN | 1250 |         4 |
| WARD   | 1250 |         4 |
| TURNER | 1500 |         5 |
+--------+------+-----------+
回答4
SELECT empno,
       deptno,
       sal,
       RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM   emp;

     EMPNO     DEPTNO        SAL       rank
---------- ---------- ---------- ----------
      7934         10       1300          1
      7782         10       2450          2
      7839         10       5000          3
      7369         20        800          1
      7876         20       1100          2
      7566         20       2975          3
      7788         20       3000          4
      7902         20       3000          4
      7900         30        950          1
      7654         30       1250          2
      7521         30       1250          2
      7844         30       1500          4
      7499         30       1600          5
      7698         30       2850          6


SELECT empno,
       deptno,
       sal,
       DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal) "rank"
FROM   emp;

     EMPNO     DEPTNO        SAL       rank
---------- ---------- ---------- ----------
      7934         10       1300          1
      7782         10       2450          2
      7839         10       5000          3
      7369         20        800          1
      7876         20       1100          2
      7566         20       2975          3
      7788         20       3000          4
      7902         20       3000          4
      7900         30        950          1
      7654         30       1250          2
      7521         30       1250          2
      7844         30       1500          3
      7499         30       1600          4
      7698         30       2850          5
回答5

RANK()和DENSE_RANK()函数之间的唯一区别是存在“并列”的情况。 也就是说,如果集合中的多个值具有相同的排名。 在这种情况下,RANK()将不连续的“等级”分配给集合中的值(导致出现平局时导致整数排名值之间的间隔),而DENSE_RANK()将连续的等级分配给集合中的值设置(因此,在平局的情况下,整数排名值之间不会有间隙)。

例如,考虑集合{25,25,50,75,75,100}。 对于这样的集合,RANK()将返回{1、1、3、4、4、6}(请注意,将跳过值2和5),而DENSE_RANK()将返回{1、2、3, 3,4}。

回答6

Rank()SQL函数生成数据在有序值集中的排名,但上一个排名之后的下一个排名是该特定行的row_number。 另一方面,Dense_Rank()SQL函数将生成下一个数字,而不是生成row_number。 以下是将阐明概念的SQL示例:

Select ROW_NUMBER() over (order by Salary) as RowNum, Salary, 
RANK() over (order by Salary) as Rnk, 
DENSE_RANK() over (order by Salary) as DenseRnk from (
Select 1000 as Salary union all
Select 1000 as Salary union all
Select 1000 as Salary union all
Select 2000 as Salary union all
Select 3000 as Salary union all
Select 3000 as Salary union all
Select 8000 as Salary union all
Select 9000 as Salary) A

它将生成以下输出:

----------------------------
RowNum  Salary  Rnk DenseRnk
----------------------------
1       1000    1   1
2       1000    1   1
3       1000    1   1
4       2000    4   2
5       3000    5   3
6       3000    5   3
7       8000    7   4
8       9000    8   5
回答7
select empno
       ,salary
       ,row_number() over(order by salary desc) as Serial
       ,Rank() over(order by salary desc) as rank
       ,dense_rank() over(order by salary desc) as denseRank
from emp ;

Row_number() ->用于生成序列号

Dense_rank()将给出连续的排名,但是Rank()将在排名冲突的情况下跳过排名。

回答8

等级和密集等级给出分区数据集中的等级。

Rank():它不会给您连续的整数。

Dense_rank():它为您提供连续的整数。

在上图中,考虑到row_number时,densed_rank()函数的10008 zip排名为2,rank()函数的排名为24。

回答9

Rank(), Dense_rank(), row_number()这些都是窗口函数,这意味着它们首先充当某个有序输入集上的窗口。 这些窗口根据需要具有附加的不同功能。 这是上面的3:

row_number()

row_number()开始,因为这形成了这些相关窗口函数的基础。 顾名思义, row_number()为应用行的行集提供了唯一的编号。 类似于为每一行提供序列号。

Rank()

row_number()可以称为rank() 。 Rank()用于为重复的那些有序集合行赋予相同的序列号,但对于重复之后的所有序列,rank()仍然保持与row_number()相似的计数,例如从下面开始。 对于数据2 row_number()= rank(),这意味着两者的重复形式有所不同。

Data row_number() rank() dense_rank() 
    1         1                    1       1
    1         2                    1       1
    1         3                    1       1
    2         4                    4       2

最后,

Dense_rank()是rank()的扩展版本,顾名思义,它是致密的,因为如上例所示,对于所有数据1,rank()= density_rank()只是对数据2而言,它的形式有所不同从先前的rank()保留rank()的顺序,而不是实际数据

回答10

RANK()和DENSE_RANK()函数之间的唯一区别是存在“并列”的情况。 也就是说,如果集合中的多个值具有相同的排名。 在这种情况下,RANK()将不连续的“等级”分配给集合中的值(导致出现平局时导致整数排名值之间的间隔),而DENSE_RANK()将连续的等级分配给集合中的值设置(因此,在平局的情况下,整数排名值之间不会有间隙)。

例如,考虑集合{30,30,50,75,75,100}。 对于这样的集合,RANK()将返回{1、1、3、4、4、6}(请注意,将跳过值2和5),而DENSE_RANK()将返回{1、2、3, 3,4}。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Oracle SQL-如何检索列的最高5个值(Oracle SQL - How to Retrieve highest 5 values of a column [duplicate])
    问题 这个问题已经在这里有了答案: Oracle SELECT TOP 10条记录(6个答案) 4个月前关闭。 您如何编写查询,其中仅返回具有最高或最低列值的选定行数。 例如,一份薪水最高的5位员工的报告? 回答1 最好的方法是使用解析函数RANK()或DENSE_RANK()... SQL> select * from ( 2 select empno 3 , sal 4 , rank() over (order by sal desc) as rnk 5 from emp) 6 where rnk <= 5 7 / EMPNO SAL RNK ---------- ---------- ---------- 7839 5000 1 7788 3000 2 7902 3000 2 7566 2975 4 8083 2850 5 7698 2850 5 6 rows selected. SQL> 出现平局时,DENSE_RANK()压缩间隙: SQL> select * from ( 2 select empno 3 , sal 4 , dense_rank() over (order by sal desc) as rnk 5 from emp) 6 where rnk <= 5 7 / EMPNO SAL RNK ---------- ---------- ----------
  • GROUP BY和DISTINCT有什么区别(Is there any difference between GROUP BY and DISTINCT)
    问题 前几天,我学到了一些关于SQL的简单知识: SELECT c FROM myTbl GROUP BY C 与以下结果相同: SELECT DISTINCT C FROM myTbl 我很好奇,SQL引擎处理命令的方式是否有所不同,或者它们确实是同一回事? 我个人更喜欢独特的语法,但是我确信它比其他任何东西都更习惯。 编辑:这不是有关聚合的问题。 了解将GROUP BY与聚合函数一起使用。 回答1 就您提出的问题而言,MusiGenesis的回答在功能上是正确的; SQL Server足够聪明,可以意识到,如果您使用的是“分组依据”而不使用任何聚合函数,那么您实际上的意思是“不同的”-因此,它生成的执行计划就像您只是使用“不同的”一样。” 但是,我认为也必须注意Hank的回应-如果不小心,对“ Group By”和“ Distinct”的轻描淡写可能会导致一些危险的陷阱。 说这不是“关于聚合的问题”是不完全正确的,因为您要询问两个SQL查询关键字之间的功能差异,其中一个SQL关键字旨在与聚合一起使用,而另一个则不能与聚合一起使用。 锤子有时可以用螺丝打入,但是如果您有一把螺丝刀,为什么要打扰呢? (出于这个类比的目的, Hammer : Screwdriver :: GroupBy : Distinct and screw => get list of unique
  • What's the difference between RANK() and DENSE_RANK() functions in oracle?
    What's the difference between RANK() and DENSE_RANK() functions? How to find out nth salary in the following emptbl table? DEPTNO EMPNAME SAL ------------------------------ 10 rrr 10000.00 11 nnn 20000.00 11 mmm 5000.00 12 kkk 30000.00 10 fff 40000.00 10 ddd 40000.00 10 bbb 50000.00 10 ccc 50000.00 If in the table data having nulls, what will happen if I want to find out nth salary?
  • MySQL中的排名函数(Rank function in MySQL)
    问题 我需要找出客户的等级。 在这里,我为我的需求添加了相应的ANSI标准SQL查询。 请帮助我将其转换为MySQL。 SELECT RANK() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender], FirstName, Age, Gender FROM Person 有什么功能可以找出MySQL的排名吗? 回答1 一种选择是使用排名变量,例如: SELECT first_name, age, gender, @curRank := @curRank + 1 AS rank FROM person p, (SELECT @curRank := 0) r ORDER BY age; (SELECT @curRank := 0)部分允许变量初始化,而无需单独的SET命令。 测试用例: CREATE TABLE person (id int, first_name varchar(20), age int, gender char(1)); INSERT INTO person VALUES (1, 'Bob', 25, 'M'); INSERT INTO person VALUES (2, 'Jane', 20, 'F'); INSERT INTO person VALUES (3, 'Jack', 30
  • 返回行,每组最大值为一列[重复](Return row with the max value of one column per group [duplicate])
    问题 这个问题已经在这里有了答案: 提取具有列最大值的行(35个答案) Oracle SQL查询:根据时间检索每个组的最新值(重复) (2个答案) 获得每个组的最佳结果(在Oracle中) (5个答案) GROUP BY with MAX(DATE)[duplicate] (6个答案) 3年前关闭。 我很难做到这一点,至少要搜索两次相同的表才能获取最大行,然后获取该行的值。 有问题的表很大,因此这是不可接受的。 这是我的表的样子: SCORES ID ROUND SCORE 1 1 3 1 2 6 1 3 2 2 1 10 2 2 12 3 1 6 我需要返回每个ID在最近一轮中获得的分数。 即,具有最大(回合)但不具有最大分数的行。 OUTPUT: ID ROUND SCORE 1 3 2 2 2 12 3 1 6 现在我有: SELECT * FROM (SELECT id, round, CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score FROM SCORES where id in (1,2,3) ) scorevals WHERE scorevals.round is not null; 这行得通,但是效率很低(我必须首先手动捕获所有这些行时
  • mysql窗口函数(分析函数)知识笔记
    窗口函数 MySQL从8.0开始支持开窗函数,这个功能在大多商业数据库中早已支持,也叫分析函数。开窗函数与分组聚合比较像,分组聚合是通过制定字段将数据分成多份,每一份执行聚合函数,每份数据返回一条结果。开窗函数也是通过指定字段将数据分成多份,也就是多个窗口,对每个窗口的每一行执行函数,每个窗口返回等行数的结果。窗口函数分为静态窗口和滑动窗口,静态窗口的大小是固定的,滑动窗口的大小可以根据设置进行变化,在当前窗口下生成子窗口。 1、窗口函数的定义 窗口函数作用于一个数据集合。窗口函数的一个概念就是当前行,当前行属于某个窗口就是从整个数据集选取一部分数据进行聚合/排名等操作。 2、窗口函数的语法 语法:函数名([参数]) over(partition by [分组字段] order by [排序字段] asc/desc rows/range between 起始位置 and 结束位置) 函数解读:函数分为两个部分,第一部分是函数名称,开窗函数的数量较少,只有11个窗口函数+聚合函数(所有聚合函数都可以用作开窗函数),根据函数性质,有的要写参数,有的不需要写参数; 第二部分是over语句,over()是必须要写的,里面有三个参数,都是非必须参数,根据需求选写: 1.第一个参数是 partition by +分组字段,将数据根据此字段分成多份,如果不加partition by参数
  • 我如何在Oracle中排名第一?(How do I do top 1 in Oracle?)
    问题 我该怎么做? select top 1 Fname from MyTbl 在Oracle 11g中? 回答1 如果只想选择第一行,则可以: select fname from MyTbl where rownum = 1 您还可以使用分析函数对前x进行排序和取值: select max(fname) over (rank() order by some_factor) from MyTbl 回答2 SELECT * FROM (SELECT * FROM MyTbl ORDER BY Fname ) WHERE ROWNUM = 1; 回答3 借助Oracle 12c(2013年6月),您可以像以下方式使用它。 SELECT * FROM MYTABLE --ORDER BY COLUMNNAME -OPTIONAL OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY 回答4 您可以在子查询中将ROW_NUMBER()与ORDER BY子句一起使用,并使用此列替换TOP N 这可以逐步解释。 请参阅下表,该表具有两列NAME和DT_CREATED 。 如果您只需要使用前两个日期(与NAME ,则可以使用以下查询。 逻辑已写入查询中 -- The number of records can be specified in WHERE clause
  • Sql学习笔记:试题库1
    SQL: 1.Mysql综合测评 1.1统计薪资大于薪资最高的员工所在部门的平均工资和薪资最低的员工所在部门的平均工资的平均工资的员工信息。 2.统计薪资和平均薪资最低的部门中薪资最高的员工的薪资相差500之内的全部员工的信息 3.统计出薪资和平均薪资处于正中间的部门中薪资最高的员工的薪资 相差500之内的全部员工的信息 4.查询部门名称不是research,职位是manager,且薪资大于平均薪资的员工(包含ename hiredait loc三个字段) 5.找出5月1号之后入职的并且薪资高于NEWYORK地区的平均薪资的员工的具体信息(部门信息代替部门编号)按薪资降序列出 6查询各个部门{工资小于【纽约员工平均工资】}且{入职时间大于30年}的员工人数(输出字段至少包含[部门地址,部门名称,人数]这三个字段) 7.查询出入职时间最早的员工所在部门的最高薪资的员工名字,工作职位.工作地点 8.统计出薪资位于平均工资最高的部门与平均薪资最低的部门之间 的入职日期最晚的员工的工作城市的所有员工的平均工资 9.查询平均工资最高的地区的最早入职的员工 10 列出各个地区平均薪资处于中等水平的地区,列出该地区人数和平均在职时间 2.Oracle数据库练习 2.1demobld.sql \-- -- Copyright (c) Oracle Corporation 1988, 2000
  • 获取具有列最大值的行(Fetch the row which has the Max value for a column)
    问题 桌子: UserId, Value, Date. 我想获取UserId,每个UserId的max(Date)值。 即,具有最新日期的每个UserId的值。 有没有一种方法可以简单地在SQL中做到这一点? (最好是Oracle) 更新:对于任何歧义,我们深表歉意:我需要获取所有UserIds。 但是对于每个UserId,仅该用户具有最新日期的那一行。 回答1 这将检索其my_date列值等于该用户ID的my_date最大值的所有行。 这可能会为用户ID检索多行,其中最大日期在多行上。 select userid, my_date, ... from ( select userid, my_date, ... max(my_date) over (partition by userid) max_my_date from users ) where my_date = max_my_date “分析功能摇滚” 编辑:关于第一个评论... “使用分析查询和自联接会破坏分析查询的目的” 此代码中没有自联接。 而是在包含分析功能的内联视图的结果上放置一个谓词-一个完全不同的问题,并且是完全标准的实践。 “ Oracle中的默认窗口是从分区的第一行到当前窗口” windowing子句仅在order by子句存在的情况下适用。 如果没有order by子句,则默认情况下不应用任何窗口子句
  • 大数据开发工程师基础面试题
    Hadoop 1.组成 2.Hdfs 文件上传 3.Hdfs 文件下载 4.MR 流程 5.MR 中combine 6.Yarn的运行流程 7.Yarn 的资源调度类型 8.Zookeeper 功能 9.Zookeeper 的主从选取机制 10.Mr 程序wordcount Spark 2.Spark 资源调度过程 3.Spark 运行流程 4.Shuffle 5.Spark 常用算子 6.缓存catch和chickpoint 7.Spark 程序 wordcount 8.Spark 调优 9.Spark 和 MR 的区别 Flume 1.事务 2.Source 3.Channal 4.Sink 5.项目中的配置 Linux 1.常用命令 2.脚本的编写 Kafka 1.组成 2.保证数据不丢数据 3.精确数据只消费一次 4.Kafka 快的原因 Hive 1.架构 2.Hivesql底层转换 MR 过程 3.内外部表 4.建表方式 5.导入数据 6.导出数据 7.分区 8.分桶 9.自定义函数UDF ,UDAF,UDTF 10.Order by , sort by , distribute by , cluster by区别 11.Rank() 和dense_rank() 的区别 12.字符串拼接 concat() concat_ws() 13.时间戳 日期转换 14
  • 最快的固定长度6 int数组(Fastest sort of fixed length 6 int array)
    问题 在回答另一个堆栈溢出问题(这个问题)时,我偶然发现了一个有趣的子问题。 对6个整数数组进行排序的最快方法是什么? 由于该问题的水平很低: 我们不能假设库可用(并且调用本身有成本),只能使用纯C语言为了避免清空指令流水线(代价非常高),我们应该尽量减少分支,跳转和所有其他类型的控制流中断(例如隐藏在&&或||序列点后面的那些)。 房间受到限制,寄存器和内存使用的最小化是一个问题,理想的情况下,排序可能是最好的。 确实,这个问题是一种高尔夫,其目标不是最小化源代码长度,而是执行时间。 我将其称为“ Zening”代码,如Michael Abrash所著的《 Zen of Code Optimization》一书的标题及其续篇所述。 至于为什么有趣,它分为几层: 该示例简单易懂,易于度量,不涉及太多C技能它显示了针对该问题选择好的算法的效果,还显示了编译器和底层硬件的效果。 这是我的参考(天真,未优化)实现和我的测试集。 #include <stdio.h> static __inline__ int sort6(int * d){ char j, i, imin; int tmp; for (j = 0 ; j < 5 ; j++){ imin = j; for (i = j + 1; i < 6 ; i++){ if (d[i] < d[imin]){ imin = i; }
  • 在Oracle中从表中删除重复的行(Removing duplicate rows from table in Oracle)
    问题 我正在Oracle中进行测试,并在表中填充了一些示例数据,但是在此过程中,我不小心加载了重复的记录,因此现在无法使用某些列创建主键。 如何删除所有重复的行并仅保留其中之一? 回答1 使用rowid伪列。 DELETE FROM your_table WHERE rowid not in (SELECT MIN(rowid) FROM your_table GROUP BY column1, column2, column3); 其中column1 , column2和column3组成了每个记录的标识键。 您可能会列出所有列。 回答2 从问汤姆 delete from t where rowid IN ( select rid from (select rowid rid, row_number() over (partition by companyid, agentid, class , status, terminationdate order by rowid) rn from t) where rn <> 1); (修复了丢失的括号) 回答3 从DevX.com: DELETE FROM our_table WHERE rowid not in (SELECT MIN(rowid) FROM our_table GROUP BY column1, column2
  • PARTITION BY with and without KEEP in Oracle
    I came across two queries which seems to have the same result: applying aggregate function on partition. I am wondering if there is any difference between these two queries: SELECT empno, deptno, sal, MIN(sal) OVER (PARTITION BY deptno) "Lowest", MAX(sal) OVER (PARTITION BY deptno) "Highest" FROM empl SELECT empno, deptno, sal, MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest", MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest" FROM empl The first version is more logical but second one may be some kind special case, maybe some
  • MySQL equivalent of ORACLES rank()
    Oracle has 2 functions - rank() and dense_rank() - which i've found very useful for some applications. I am doing something in mysql now and was wondering if they have something equivalent to those?
  • 根据另一列分组的另一列的最大值获取值(Get value based on max of a different column grouped by another column [duplicate])
    问题 这个问题已经在这里有了答案: 提取具有列最大值的行(35个答案) 5年前关闭。 我想基于另一列分组的另一列的最大值来获取一列的值。 我有这张桌子: KEY NUM VAL A 1 AB B 1 CD B 2 EF C 2 GH C 3 HI D 1 JK D 3 LM 并想要这个结果: KEY VAL A AB B EF C HI D LM 我实际上可以使用此查询来获取它。 select KEY, VAL from TABLE_NAME TN where NUM = ( select max(NUM) from TABLE_NAME TMP where TMP.KEY = TN.KEY ) 但是,在ORACLE SQL(10g或更高版本)中是否有更优雅的方法来获取结果? 其背后的原因是实际上有多个KEY ,而且看起来有点难看。 回答1 您可以使用row_number()处理此问题: select key, val from (select t.*, row_number() over (partition by key order by num desc) as seqnum from table_name t ) t where seqnum = 1; 您是否认为这更“优雅”可能与您的口味有关。 我应该指出,这与您的查询有细微的区别。 这样可以确保每个key返回一行
  • 在不创建存储过程的情况下,如何在Oracle中将多行串联在一起? [复制](How can multiple rows be concatenated into one in Oracle without creating a stored procedure? [duplicate])
    问题 这个问题已经在这里有了答案: SQL查询以连接Oracle中多个行的列值(10个答案) 6年前关闭。 如何在不创建存储过程的情况下在oracle中实现以下目标? 资料集: question_id element_id 1 7 1 8 2 9 3 10 3 11 3 12 预期结果: question_id element_id 1 7,8 2 9 3 10,11,12 回答1 有很多方法可以进行字符串聚合,但是最简单的方法是用户定义函数。 以不需要功能的方式尝试此操作。 注意,没有该功能没有简单的方法。 这是没有自定义函数的最短路由:(它使用ROW_NUMBER()和SYS_CONNECT_BY_PATH函数) SELECT questionid, LTRIM(MAX(SYS_CONNECT_BY_PATH(elementid,',')) KEEP (DENSE_RANK LAST ORDER BY curr),',') AS elements FROM (SELECT questionid, elementid, ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) AS curr, ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY
  • hive窗口函数/分析函数详细剖析
    hive窗口函数/分析函数在sql中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。窗口函数又叫OLAP函数/分析函数,窗口函数兼具分组和排序功能。窗口函数最重要的关键字是 partition by 和 order by。具体语法如下:over (partition by xxx order by xxx)sum,avg,min,max 函数准备数据 1建表语句: 2create table bigdata_t1( 3cookieid string, 4createtime string, --day 5pv int 6) row format delimited 7fields terminated by ','; 8 9加载数据:10load data local inpath '/root/hivedata/bigdata_t1.dat' into table bigdata_t1;1112cookie1,2018-04-10,113cookie1,2018-04-11,514cookie1,2018-04-12,715cookie1,2018-04-13,316cookie1,2018
  • 浅谈oracle中row_number() over()分析函数用法
    浅谈oracle中row_number() over()分析函数用法 row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。 rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。 oracle 分析函数 row_number(),返回一个整数值(>=1); 语法格式: 1.row_number() over (order by col_1[,col_2 ...]) 作用:按照col_1[,col_2 ...]排序,返回排序后的结果集, 此用法有点像rownum,为每一行返回一个不相同的值: select rownum,ename,job, row_number() over (order by rownum) row_number from
  • 如何创建连续的组号(How to create a consecutive group number)
    问题 我有一个数据框( all_data ),其中有一个站点列表(1 ...至n)及其得分,例如 site score 1 10 1 11 1 12 4 10 4 11 4 11 8 9 8 8 8 7 我想创建一列,以数字顺序对网站的每个级别进行编号,例如计数器。 在示例中,站点(1、4和8)在“数字”列中将具有从1到3的对应计数器: site score number 1 10 1 1 11 1 1 12 1 4 10 2 4 11 2 4 11 2 8 9 3 8 8 3 8 7 3 我相信这必须很容易解决,但是我还没有找到办法。 回答1 尝试Data$number <- as.numeric(as.factor(Data$site)) 旁注:一方面,我和@Chase的解决方案之间的区别,另一方面,对于@DWin的解决方案之间的区别是数字的排序。 as.factor和factor都将自动对级别进行排序,而在@DWin的解决方案中不会发生这种情况: Dat <- data.frame(site = rep(c(1,8,4), each = 3), score = runif(9)) Dat$number <- as.numeric(factor(Dat$site)) Dat$sitenum <- match(Dat$site, unique(Dat$site) ) 给 >
  • How to emulate SQLs rank functions in R?
    What is the R equivalent of rank functions like the Oracle ROW_NUMBER(), RANK(), or DENSE_RANK() ("assign integer values to the rows depending on their order"; see http://www.orafaq.com/node/55)? I agree that the functionality of each function can potentially be achieved in an ad-hoc fashion. But my main concern is the performance. It would be good to avoid using join or indexing access, for the sake of memory and speed.