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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
大数据开发治理平台 DataWorks,不限时长
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 创建了一个名为`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

相关文章
|
1月前
|
SQL HIVE
【Hive SQL 每日一题】环比增长率、环比增长率、复合增长率
该文介绍了环比增长率、同比增长率和复合增长率的概念及计算公式,并提供了SQL代码示例来计算商品的月度增长率。环比增长率是相邻两期数据的增长率,同比增长率是与去年同期相比的增长率,复合增长率则是连续时间段内平均增长的速率。文章还包含了一组销售数据用于演示如何运用这些增长率进行计算。
|
1天前
|
SQL
sql语句按指定某个字段分组后删除重复数据只保留id最小/最大的一条数据
sql语句按指定某个字段分组后删除重复数据只保留id最小/最大的一条数据
3 0
|
1月前
|
SQL HIVE
【Hive SQL】字符串操作函数你真的会用吗?
本文介绍了SQL中判断字符串是否包含子串的几种方法。`IN`函数判断元素是否完全等于给定元素组中的某项,而非包含关系。`INSTR`和`LOCATE`函数返回子串在字符串中首次出现的位置,用于检测是否存在子串。`SUBSTR`则用于提取字符串的子串。`LIKE`用于模糊匹配,常与通配符配合使用。注意`IN`并非用于判断子串包含。
|
1月前
|
SQL BI HIVE
【Hive SQL 每日一题】统计用户留存率
用户留存率是衡量产品成功的关键指标,表示用户在特定时间内持续使用产品的比例。计算公式为留存用户数除以初始用户数。例如,游戏发行后第一天有10000玩家,第七天剩5000人,第一周留存率为50%。提供的SQL代码展示了如何根据用户活动数据统计每天的留存率。需求包括计算系统上线后的每日留存率,以及从第一天开始的累计N日留存率。通过窗口函数`LAG`和`COUNT(DISTINCT user_id)`,可以有效地分析用户留存趋势。
|
19天前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
24 0
|
22天前
|
SQL 数据库
数据库sql语句分组
在SQL中,`GROUP BY`语句用于将多行数据根据一个或多个列进行分组,以便可以对每个分组执行聚合函数,如计数、求和、求平均等。以下是一些基本的SQL分组示例。 1. **基本分组**
|
30天前
|
SQL HIVE
【Hive SQL 每日一题】统计用户连续下单的日期区间
该SQL代码用于统计用户连续下单的日期区间。首先按`user_id`和`order_date`分组并去除重复,然后使用`row_number()`标记行号,并通过`date_sub`与行号计算潜在的连续日期。接着按用户ID和计算后的日期分组,排除连续订单数少于2的情况,最后提取连续下单的起始和结束日期。输出结果展示了用户连续下单的日期范围。
|
1月前
|
SQL 关系型数据库 HIVE
【Hive SQL 每日一题】统计最近1天/7天/30天商品的销量
这段内容是关于SQL查询的示例,目标是统计`sales`表中最近1天、7天和30天的商品销量和销售次数。表结构包含`id`、`product_id`、`quantity`和`sale_date`字段。初始查询方法通过三个独立的子查询完成,但效率较低。优化后的查询使用了`lateral view explode`将数据炸裂,通过一次查询同时获取所有所需时间段的数据,提高了效率。示例中展示了优化前后的SQL代码及结果对比。
|
1月前
|
SQL HIVE
【Hive SQL 每日一题】统计最近7天内连续下单3日的用户量
创建了一个名为`sales`的测试表,包含`user_id`、`product_id`、`quantity`和`sale_date`字段,插入了多条销售数据。需求是找出最近7天内连续下单3天的用户数量。SQL查询通过分组和窗口函数`row_number()`检查日期连续性,最终计算满足条件的唯一用户数。示例结果显示有3名用户符合条件。
|
8天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程