开发者社区 > 大数据与机器学习 > 大数据开发治理DataWorks > 正文

请问一下,odps有函数支持分组内排序后取组内第几条数值的吗?比如一个课程 有6节课,我要取第3节课

请问一下,odps有函数支持分组内排序后取组内第几条数值的吗?比如一个课程 有6节课,我要取第3节课?

展开
收起
xin在这 2023-04-19 23:49:36 186 0
1 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    阿里云DataWorks中的ODPS支持使用ROW_NUMBER()函数实现分组内排序后取组内第几条数值的操作。

    具体使用方法如下:

    1、在ODPS SQL中,使用ORDER BY子句对需要排序的字段进行排序,例如:

    SELECT *
    FROM my_table
    ORDER BY group_id, score DESC;
    

    这里假设需要对my_table表中的score字段进行降序排序,并按照group_id字段进行分组。

    2、在排序后的结果集上,使用ROW_NUMBER()函数进行编号,例如:

    SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY score DESC) AS row_num
    FROM my_table
    ORDER BY group_id, score DESC;
    

    这里使用PARTITION BY子句指定按照group_id字段进行分组,使用ORDER BY子句指定按照score字段进行排序。ROW_NUMBER()函数会为每个分组内的数据按照score字段进行编号,编号从1开始。

    3、最后,根据需要获取分组内的第几条数据,使用WHERE子句过滤结果集,例如:

    SELECT *
    FROM (
      SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY score DESC) AS row_num
      FROM my_table
      ORDER BY group_id, score DESC
    ) t
    WHERE t.row_num = 1;
    

    这里过滤出了每个分组内的第一条数据,即分组内score字段最大的数据。

    ROW_NUMBER()函数的使用需要在ODPS 2.0及以上版本中进行。同时,如果需要获取分组内的第N条数据,可以将WHERE子句中的“t.row_num = N”修改为“t.row_num <= N”,并将最终结果按照group_id和row_num排序。

    2023-04-20 21:50:10
    赞同 展开评论 打赏

DataWorks基于MaxCompute/Hologres/EMR/CDP等大数据引擎,为数据仓库/数据湖/湖仓一体等解决方案提供统一的全链路大数据开发治理平台。

相关电子书

更多
DataWorks数据集成实时同步最佳实践(含内测邀请)-2020飞天大数据平台实战应用第一季 立即下载
DataWorks调度任务迁移最佳实践-2020飞天大数据平台实战应用第一季 立即下载
基于DataWorks数据服务构建疫情大屏-2020飞天大数据平台实战应用第一季 立即下载