hive写法:表中有用户id,每个用户有多个单号,对应不同时间,现要提取每个客户近1个月单数、近3个月单数、近6个月单数、近9个月单数,只写一个子查询
时间: 2024-10-01 11:05:51 浏览: 33
在Hive中,你可以使用窗口函数(Window Function)和日期范围来实现这个需求。假设你的表名为`user_orders`,字段包括`user_id`, `order_no`, 和 `order_date`。这里是一个示例的SQL写法:
```sql
WITH recent_orders AS (
SELECT
user_id,
order_no,
order_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date DESC) as row_num
FROM
user_orders
WHERE
order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH) -- 近1个月
AND order_date <= CURRENT_DATE() -- 到当前日期
)
SELECT
user_id,
COUNT(DISTINCT case when row_num <= 4 then order_no end) as month1,
COUNT(DISTINCT case when row_num <= 12 then order_no end) as month3,
COUNT(DISTINCT case when row_num <= 24 then order_no end) as month6,
COUNT(DISTINCT case when row_num <= 36 then order_no end) as month9
FROM
recent_orders
GROUP BY
user_id;
```
这个查询首先创建了一个名为`recent_orders`的临时视图,其中按照用户ID排序并计算了每行的行号(按最近到最旧)。然后通过CASE语句分别统计了近1个月、近3个月、近6个月和近9个月(对应row_num小于等于4、12、24、36的情况)的不同订单。
阅读全文