【Hive SQL 每日一题】分组排名取值

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 创建了一个名为`sales_data`的测试表,包含商品ID、销售额和销售日期。展示了部分示例数据。接着,提供了三个SQL查询:1) 查找每个商品销售额最高的记录;2) 获取每个商品最近和最远的销售记录;3) 求每个商品距今第二近的销售记录。每个查询都利用了窗口函数来处理数据,并给出了相应的查询结果图。

@[toc]

测试数据

DROP TABLE IF EXISTS sales_data;
CREATE TABLE sales_data (
    id STRING,
    sales_amount INT,
    sales_date STRING
);

INSERT INTO sales_data (id, sales_amount, sales_date) VALUES
('A', 100, '2024-01-01'),
('A', 150, '2024-01-02'),
('A', 90, '2024-01-03'),
('B', 200, '2024-01-01'),
('B', 50, '2024-01-02'),
('B', 300, '2024-01-03'),
('C', 120, '2024-01-01'),
('C', 180, '2024-01-02'),
('C', 140, '2024-01-03');

这是一张记录商品每日销售记录的表,结构以及数据展示如下:

id sales_amount sales_date
A 100 2024-01-01
A 150 2024-01-02
A 90 2024-01-03
B 200 2024-01-01
B 50 2024-01-02
B 300 2024-01-03
C 120 2024-01-01
C 180 2024-01-02
C 140 2024-01-03

字段说明

  • id:商品ID;

  • sales_amount:销售额;

  • sales_date:销售日期。

求各个商品销售额最高的记录

select
    id,
    sales_amount,
    sales_date
from
    (select
        id,
        sales_amount,
        sales_date,
        rank() over(partition by id order by sales_amount desc) rk
    from
        sales_data)t1
where
    rk = 1;

这个需求使用窗口函数能够轻松完成,分成两步:

  • 利用窗口函数分组降序排列;

  • 通过排名过滤获取最高的销售记录。

结果如下所示:

image.png

求各个商品距今最近及最远的销售记录

select
    id,
    sales_amount,
    sales_date
from
    (select
        id,
        sales_amount,
        sales_date,
        max(sales_date) over(partition by id) max_sales_date,
        min(sales_date) over(partition by id) min_sales_date
    from
        sales_data)t1
where
    sales_date = max_sales_date or sales_date = min_sales_date;

这个需求同样可以利用开窗解决,分为两步:

  • 先使用开窗获取销售记录最近以及最远日期;

  • 通过日期过滤获取最终结果。

结果如下所示:

image.png

求各个商品距今第二近的销售记录

select
    id,
    sales_amount,
    sales_date
from
    (select
        id,
        sales_amount,
        sales_date,
        row_number() over(partition by id order by diff_days desc) rn
    from
        (select
            id,
            sales_amount,
            sales_date,
            datediff(current_date(),sales_date) diff_days
        from
            sales_data)t1 )t2
where
    rn = 2;

本题的关键在于如何理解“第二近的销售记录”,假设某商品有如下销售记录:

  • 2022-01-01 销售额为 100 元;

  • 2022-01-10 销售额为 150 元;

  • 2022-01-15 销售额为 130 元;

  • 此外没有其它销售记录。

那么距今第二近的销售记录显然是第二条,也就是在 2022-01-10 的销售数据。

那么明白了需求,想想该如何去实现呢?

  • 首先,计算出每条销售记录距今的销售日期差值;

  • 然后,利用窗口函数对日期差值进行降序排序,取排名为 2 的数据,这样就能得到结果啦。

使用该方法不仅能获取到距今第 2 近的商品销售记录,还可以获取第 n 近的商品销售记录,只需要改变排序的过滤条件即可。

结果如下所示:

image.png

相关文章
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
80 3
|
2月前
|
SQL
创建分组总计查询的SQL技巧与方法
在SQL中,创建分组总计查询(也称为聚合查询)是一项非常基础且重要的技能
|
2月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
56 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
103 0
|
4月前
|
SQL 存储 分布式计算
插入Hive表数据SQL
【8月更文挑战第10天】
|
4月前
|
SQL 物联网 数据处理
"颠覆传统,Hive SQL与Flink激情碰撞!解锁流批一体数据处理新纪元,让数据决策力瞬间爆表,你准备好了吗?"
【8月更文挑战第9天】数据时代,实时性和准确性至关重要。传统上,批处理与流处理各司其职,但Apache Flink打破了这一界限,尤其Flink与Hive SQL的结合,开创了流批一体的数据处理新时代。这不仅简化了数据处理流程,还极大提升了效率和灵活性。例如,通过Flink SQL,可以轻松实现流数据与批数据的融合分析,无需在两者间切换。这种融合不仅降低了技术门槛,还为企业提供了更强大的数据支持,无论是在金融、电商还是物联网领域,都将发挥巨大作用。
64 6
|
5月前
|
SQL 数据挖掘 数据库
SQL分组函数
【7月更文挑战第24天】SQL分组函数
41 1
|
4月前
|
SQL
SQL SERVER数据分组后取第一条数据——PARTITION BY
SQL SERVER数据分组后取第一条数据——PARTITION BY
172 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL获取分组里的最新数据如何写sql
MySQL获取分组里的最新数据如何写sql
58 0
下一篇
DataWorks