hive rpt_comm_cm_serv_cdma会有重复的cust_id,请排序cust_id取最大create_date值剔除重复,关联更新。
时间: 2024-02-03 21:12:07 浏览: 74
你可以使用以下SQL语句来实现:
```
INSERT OVERWRITE TABLE target_table
SELECT t1.*
FROM (
SELECT cust_id, MAX(create_date) AS max_create_date
FROM hive_table
GROUP BY cust_id
) t2
JOIN hive_table t1
ON t1.cust_id = t2.cust_id AND t1.create_date = t2.max_create_date;
```
上述SQL语句中,`hive_table`是你的源表,`target_table`是你要更新的目标表。首先,我们对源表进行分组,以`cust_id`为键,取每个`cust_id`的最大`create_date`。然后,我们将这个结果与源表进行连接,找到每个`cust_id`对应的最新记录,最后将结果插入到目标表中。
需要注意的是,如果存在多个`cust_id`对应的最大`create_date`相同的记录,那么上述SQL语句只会插入其中任意一个记录,因为在连接时只能匹配一个记录。如果你需要保留这些记录,可以将目标表改为一个包含`cust_id`和`create_date`的联合主键的表,并根据需要修改SQL语句。
相关问题
hive语法 rpt_comm_cm_serv_cdma会有重复的cust_id,请排序cust_id取最大create_date值剔除重复,关联更新。
可以使用以下HiveQL语句实现:
```
INSERT OVERWRITE TABLE rpt_comm_cm_serv_cdma
SELECT t1.*
FROM rpt_comm_cm_serv_cdma t1
JOIN (
SELECT cust_id, MAX(create_date) AS max_create_date
FROM rpt_comm_cm_serv_cdma
GROUP BY cust_id
) t2
ON t1.cust_id = t2.cust_id AND t1.create_date = t2.max_create_date;
```
以上语句中,首先使用子查询找出每个cust_id对应的最大create_date值,然后将该子查询结果与原表进行关联,选择cust_id和create_date都符合条件的记录,即可得到排序后去重的结果。最后使用INSERT OVERWRITE语句将结果覆盖原表。
将代码改写成hive语法 UPDATE rpt_comm_cm_serv_cdma t1INNER JOIN ( SELECT cust_id, MAX(create_date) AS max_create_date FROM rpt_comm_cm_serv_cdma GROUP BY cust_id HAVING COUNT(cust_id) > 1) t2 ON t1.cust_id = t2.cust_id AND t1.create_date < t2.max_create_dateSET t1.status = 'D';
把这段SQL代码改写成HiveQL语法应该如下:
```
UPDATE rpt_comm_cm_serv_cdma t1
SET t1.status = 'D'
WHERE t1.cust_id IN (
SELECT t2.cust_id
FROM (
SELECT cust_id, MAX(create_date) AS max_create_date
FROM rpt_comm_cm_serv_cdma
GROUP BY cust_id
HAVING COUNT(cust_id) > 1
) t2
WHERE t1.cust_id = t2.cust_id AND t1.create_date < t2.max_create_date
);
```
需要注意的是,HiveQL中不支持直接在`UPDATE`语句中使用`JOIN`操作,而是需要使用子查询来实现类似的功能。同时,HiveQL的语法和SQL略有不同,需要注意一些细节。
阅读全文