hivesql窗口常见的面试场景
时间: 2025-05-26 17:27:18 浏览: 18
### HiveSQL窗口函数常见面试题
#### 1. 窗口函数的概念及其作用
窗口函数允许在不改变原始表结构的情况下,基于一组记录计算聚合值。这使得可以在同一查询中既保留行级别细节又获得汇总信息。
```sql
-- 计算每个订单中的商品数量排名
SELECT
order_id,
item_id,
quantity,
RANK() OVER (PARTITION BY order_id ORDER BY quantity DESC) as rank_num
FROM orders;
```
这种功能对于复杂的业务逻辑处理非常重要[^2]。
#### 2. 使用场景举例
假设有一个电商交易数据库,其中包含多个订单以及每笔订单下的各个商品详情。如果想要知道某个具体订单里哪些产品销量最高,则可以通过`RANK()`或者`DENSE_RANK()`来实现这样的需求:
```sql
WITH ranked_sales AS (
SELECT
order_id,
item_id,
SUM(quantity) as total_quantity,
DENSE_RANK() OVER(PARTITION BY order_id ORDER BY SUM(quantity) DESC) as dense_rank
FROM sales_table
GROUP BY order_id, item_id
)
SELECT * FROM ranked_sales WHERE dense_rank = 1;
```
这段代码会返回每一个订单中最畅销的商品项[^5]。
#### 3. 关键字解析
- `OVER`: 定义了一个用于应用窗口函数的数据集范围。
- `PARTITION BY`: 类似于分组操作符`GROUP BY`,但是它不会减少结果集中行的数量;而是创建独立的小型分区来进行后续运算。
- `ORDER BY`: 对当前分区内的数据按照指定列排序以便正确分配窗口函数的结果。
#### 4. 实际案例演示
考虑如下表格结构:
|order_id |item_id |quantity|
|---|---|---|
|1 |1001 |2 |
|1 |1002 |3 |
|2 |1003 |1 |
要获取各订单下按购买量降序排列的位置编号(pos),可使用如下语句:
```sql
SELECT
order_id,
ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY quantity DESC) as pos,
item_id,
quantity
FROM table_name;
```
上述命令将会产生类似下面的结果集:
|order_id |pos |item_id |quantity|
|--|--|--|--|
|1 |1 |1002 |3 |
|1 |2 |1001 |2 |
|2 |1 |1003 |1 |
通过这种方式,不仅可以保持原有记录不变,还能轻松地为每一类别的条目赋予相对位置或累计统计等附加属性。
阅读全文
相关推荐

















