rank,dense_rank,row_number,ntile区别和用法。

2023-12-11 10:48

本文主要是介绍rank,dense_rank,row_number,ntile区别和用法。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景,忙完了。终于不用再赶了,自己在做项目中遇到的和当时迷惑的某些点,记录了一下,现在来做一个总结。
RANK() 排序相同时会重复,总数不会变。
DENSE_RANK()排序相同时会重复,总数会减少。 (dense:稠密的意思)

1建表
create table product_sell (
big_class string,
small_class string,
money double
) partitioned by (da string)
2插入数据
insert into product_sell partition (da=“201907”)
values
(“彩电”, “L55E5800A-UD”, 80),
(“彩电”, “L55V6500A-3D”, 90),
(“彩电”, “LSC550FN11-C”, 100),
(“冰箱”, “BCD-520WBEPF2”, 80),
(“冰箱”, “BCD-435WBEPIZ50”, 90),
(“冰箱”, “BCD-202U16”, 100),
(“空调”, “KFRd-35G/E012BpA”, 90),
(“空调”, “KFRd-26GW/DBp-XP21”, 100),
(“空调”, “KFR-35W/S13”, 100);
3.测试
3.1 RANK
查询本月个品类各型号销售额
select *, rank() over (partition by big_class order by money desc) from product_sell where da=“201907”;
在这里插入图片描述
分析看看:空调先并列第一,但没有第二直接到第三了。这个排序不太符合平常的查看习惯。如果出现并列最好后面的提到前面就好,这时就可以用dense_rank()
3.2dense_rank()在这里插入图片描述
dense,意思是稠密的,而rank()生成的排名序列中可能有空隙(可能是不连续的)。dense_rank()则是排序稠密的连续的
3.3row_number()
需求改了,

  1. 首先按照销售额排序
  2. 销售额相同的不要并列,而是再小品类排序
    在这里插入图片描述
    3.4 nticle :切片后的属于哪个切片的值
    在这里插入图片描述

4.总结
ntile/rank / dense_rank / row_number的语法都是一样的,都可以进行排序,不同的只是几个特性:
ntile :指的是将数据分几份,返回的份序列号。

  1. rank / dense_rank都考虑了并列的情况,所以序号可能不唯一,rank在出现并列之后会不连续,而dense_rank是连续的
  2. row_number不考虑并列的情况,所以序号是唯一的,并且也不会出现不连续。因此利用这个特性在给表去重和选择主键是可以用此种方法。这个在下面的文章中做介绍。

这篇关于rank,dense_rank,row_number,ntile区别和用法。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480422

相关文章

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

深入探讨:ECMAScript与JavaScript的区别

在前端开发的世界中,JavaScript无疑是最受欢迎的编程语言之一。然而,很多开发者在使用JavaScript时,可能并不清楚ECMAScript与JavaScript之间的关系和区别。本文将深入探讨这两者的不同之处,并通过案例帮助大家更好地理解。 一、什么是ECMAScript? ECMAScript(简称ES)是一种脚本语言的标准,由ECMA国际组织制定。它定义了语言的语法、类型、语句、