hive写法:表中有用户id,每个用户有多个单号,对应不同时间,现要提取每个客户近1个月单数、近3个月单数、近6个月单数、近9个月单数、
时间: 2024-09-30 18:11:37 浏览: 33
在Hive中,如果你想要统计每个用户的近一个月、三个月、六个月和九个月内的订单数量,你可以使用窗口函数(Window Function)结合日期范围来实现。假设有一个名为`orders`的表,包含`user_id`, `order_id`, 和 `order_date`字段,可以尝试以下查询:
```sql
WITH monthly_windows AS (
SELECT
user_id,
order_id,
order_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date DESC) as row_num,
DATE_SUB(CURRENT_DATE(), INTERVAL '1 MONTH') as one_month_ago,
DATE_SUB(CURRENT_DATE(), INTERVAL '3 MONTH') as three_months_ago,
DATE_SUB(CURRENT_DATE(), INTERVAL '6 MONTH') as six_months_ago,
DATE_SUB(CURRENT_DATE(), INTERVAL '9 MONTH') as nine_months_ago
)
SELECT
user_id,
COUNT(DISTINCT order_id) FILTER(WHERE order_date >= one_month_ago AND order_date < DATE_ADD(one_month_ago, INTERVAL 1 MONTH)) as recent_1_month_orders,
COUNT(DISTINCT order_id) FILTER(WHERE order_date >= three_months_ago AND order_date < DATE_ADD(three_months_ago, INTERVAL 1 MONTH)) as recent_3_month_orders,
COUNT(DISTINCT order_id) FILTER(WHERE order_date >= six_months_ago AND order_date < DATE_ADD(six_months_ago, INTERVAL 1 MONTH)) as recent_6_month_orders,
COUNT(DISTINCT order_id) FILTER(WHERE order_date >= nine_months_ago AND order_date < DATE_ADD(nine_months_ago, INTERVAL 1 MONTH)) as recent_9_month_orders
FROM
monthly_windows
GROUP BY
user_id;
```
这个查询首先创建了一个窗口函数,对每个用户按订单日期降序排序,并为每行分配一个行号。然后,它计算了从当前日期减去指定月份数的开始日期到下个月初之间的订单数量。
注意:Hive中的日期处理可能会依赖于具体的版本和配置,这里假设的是Hadoop Hive。如果存在其他数据库系统,语法可能需要调整。同时,某些老版本的Hive可能不支持窗口函数,这种情况下可能需要借助自连接或者MapReduce作业来实现类似的功能。
阅读全文