hive中有row_number() over (partition by)函数,可以一句SQL实现想要的排序,在ClickHouse中有很多种实现方式,本篇就介绍一下几种方法。

目录

1.row_number排序

2.row_number排序后取出rank=1的结果

3.特殊场景


1.row_number排序

HIVE中写法:

select number,row_number() over (partition by number order by time desc) as rankfrom table aGROUP BY number

ClickHouse写法:

select number,groupArray(time) AS arr_val,arrayEnumerate(arr_val) as row_numberfrom (select distinct orderid as number,toDate(operatetime) as timefrom tableorder by time desc) aGROUP BY number

2.row_number排序后取出rank=1的结果

hive写法:

select orderidfrom (select orderid,row_number() over(partition by orderid order by datachange_lasttime desc) as row_numfrom tablewhere d = '${CurrentDate}') awhere row_num = 1;

ClickHouse写法:

方法1:利用groupArray

select orderid, groupArray(1)(datachange_lasttime) as datesfrom (select orderid, datachange_lasttimefrom tableORDER BY orderid, datachange_lasttime desc) agroup by orderid

方法2:利用max函数实现倒序,如果正序使用min函数即可

select orderid,max(datachange_lasttime) as datachange_lasttimefrom tablegroup by orderid

方法3:利用rowNumberInAllBlocks函数

select orderid, statusfrom (select orderid, status, rowNumberInAllBlocks() as rankfrom (select orderid, status, datachange_lasttimefrom tableorder by orderid, datachange_lasttime desc) a) b LIMIT 1 BY orderid

方法4:利用arrayEnumerate函数

select orderidfrom (select orderid,groupArray(datachange_lasttime) AS arr_val,arrayEnumerate(arr_val) as row_numberfrom (select orderid, datachange_lasttimefrom tableorder by datachange_lasttime desc) aGROUP BY number) bwhere row_number = 1

3.特殊场景

要求:

对于以下场景,需要按照orderid分组,按照日期倒序,取最新一条,若日期一致,则随机取一条作为结果即可

hive写法:

select orderidfrom (select orderid,status,row_number() over(partition by orderid order by datachange_lasttime desc) as row_numfrom tablewhere d = '${CurrentDate}') as bwhere row_num = 1

ClickHouse写法:

通过上面的案例,我们很容易想到,把上面的结果作为一个子表,与原表进行关联,只是这样关联,随便举一个关联的写法:

select a.orderid as orderid_a, a.status as statusfrom olap_htlmaindb.tmp_ord_orders_status_s_pre ainner join (select orderid, groupArray(1)(datachange_lasttime) as datesfrom (select orderid, datachange_lasttimefrom tableORDER BY orderid, datachange_lasttime desc) agroup by orderid) bon a.orderid = b.orderidand cast(a.datachange_lasttime as String) = cast(b.dates [ 1 ] as String) 

这里我们是先把符合要求的orderid和时间取出来,再回去关联,取出需要的列,因为这些函数都有一个缺点是只能有partition by的字段和排序字段,不能有其他字段,所以要返回关联,所以上面四种方法,ininer join原表,都不能解决上面案例的问题。

这里就想到了LIMIT 1 BY这个方法,这个方法其实是最有效的,如下:

select orderid, status, datachange_lasttimefrom tableorder by orderid, datachange_lasttime desc LIMIT 1 BY orderid

【ClickHouse】row_number() over (partition by)的几种实现方法相关推荐

  1. 使用ROW_NUMBER 和partition by 解决报表中的查询问题

    在报表中遇到一个查询问题: 原始数据如下: Id cust_id call_date call_result 1 1 2012-03-15 09:00:00 fail 2 1 2012-03-15 0 ...

  2. mysql col与row_使用mysql实现row_number() over(partition by col1 order by col2)函数

    [color=red]row_number() OVER (PARTITION BY COL1 ORDER BY COL2)[/color] 表示根据COL1分组,在分组内部根据 COL2排序,而此函 ...

  3. 巧用row_number和partition by分组取top数据

    2019独角兽企业重金招聘Python工程师标准>>> 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 20 ...

  4. mysql实现row_number()和row_number() over(partition by)

    row_number() 仅仅是价格排序字段 select @rownum := @rownum + 1 as rn, t.*from (select @rownum := 0) r, test_ta ...

  5. ROW_NUMBER() OVER (PARTITION BY 字段1 ORDER BY 字段2 DESC)

    这个用法在mysql 中没有,就是对数据先根据字段1聚合,在根据字段二排序 select * from (SELECT player_id , DATE(timestamp ) as dt ,ROW_ ...

  6. row_number() over(partition by的用法

    row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编 ...

  7. row_number() OVER(PARTITION BY)函数

    OVER(PARTITION BY)函数介绍 开窗函数                Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组 ...

  8. Row_number () over (partition by col1 order by col2)的用法

    ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) --(其中,COL1,COL2可以为多列) select xt.id,        xt.it ...

  9. row_number() over (partition by....order by...)用法 分组排序

    row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编 ...

最新文章

  1. CRLB Case Practice ( No.1 )
  2. 零基础学习JavaSE(一)
  3. 怎样解决IPv4网络和IPv6网络的共存互通?
  4. 面试官:Maven 的这 7 个问题你思考过没有?
  5. 用matlab生成ASK FSK PSK,通信原理课程设计(matlab实现ASK FSK PSK).doc
  6. POJ 1521 Entropy
  7. 定制自己的Windows CE 5.0 ARM中文模拟器(转)
  8. 为什么现在好多年轻人连1万都掏不出来,却觉得100万很少?
  9. dismiss android,[转]Android对话框中dismiss和cancel、hide的区别
  10. 从零开始通过 Artifactory 搭建公网的 maven 仓库
  11. c+ socket编程
  12. 如何在隐藏视图时使用自动布局移动其他视图?
  13. Redis集群的搭建与主从复制,redis-cluster
  14. Qt保存日志调试信息输出文件
  15. 考研经验贴(南京航空航天大学,电子信息专硕)
  16. Java 获取姓氏并获取姓氏的笔画数
  17. Au 效果器详解:响度计
  18. app热更新失败:安装wgt文件失败[-1205]:WGT安装包中manifest.json文件的version版本不匹配
  19. upc第五场问题 F: 素数分解
  20. RSA参数及RSA用法

热门文章

  1. Qt5官方demo解析集13——Qt Quick Particles Examples - Image Particles
  2. QQ2013 正式版 SP4 8796聊天内容获取
  3. Java—文件I/O操作
  4. python绘制荷花_Python模块学习——optparse
  5. Unity灯光效果及设置
  6. 随机化策略——随机变量rand、约束constraint、权重dist、随机数产生示例
  7. 6月24日科技资讯|QQ 邮箱漂流瓶将下线;华为美国公司起诉美商务部;Ubuntu 不会放弃 32 位应用程序支持
  8. linux预留的系统调用号,linux 系统调用号
  9. Python用turtle库绘制图形——漂亮的玫瑰
  10. i3 1315U参数 i3-1315U性能怎么样 酷睿i31315U相当于什么水平