有几个这样的问题,没有答案,比如这个 here.
我想我会再发布一篇,希望能得到一个。
我有一个包含重复行的配置单元表。考虑以下示例:
*ID Date value1 value2*
1001 20160101 alpha beta
1001 20160201 delta gamma
1001 20160115 rho omega
1002 20160101 able charlie
1002 20160101 able charlie
完成后,我只想要两条记录。具体来说,这两个:
*ID Date value1 value2*
1001 20160201 delta gamma
1002 20160101 able charlie
为什么是这两个?对于 ID=1001,我想要最新日期以及该行中的数据。对于 ID=1002,确实是相同的答案,但是具有该 ID 的两条记录完全重复,而我只想要一条。
那么,关于如何做到这一点有什么建议吗?使用 ID 和“最大”日期的简单“分组依据”将不起作用,因为它会忽略其他列。我不能在这些上放置“max”,因为它会从所有记录中提取最大列(将从较旧的记录中提取“rho”),这不好。
我希望我的解释是清楚的,并且我很欣赏任何见解。
谢谢
最佳答案
试试这个:
WITH temp_cte AS (
SELECT mt.ID AS ID
, mt.Date AS Date
, mt.value1 AS value1
, mt.value2 AS value2
, ROW_NUMBER() OVER (PARTITION BY mt.ID ORDER BY mt.Date DESC) AS row_num
FROM my_table mt
)
SELECT tc.ID AS ID
, tc.Date AS Date
, tc.value1 AS value1
, tc.value2 AS value2
FROM temp_cte tc
WHERE tc.row_num = 1
;
或者您可以执行 MAX() 并将表与其自身连接,其中 ID = ID 且 max_date = Date。 HTH。
2022 年 3 月编辑: 由于 ROW_NUMBER 对每一行进行编号,并且用户只关心具有最大日期的 1 行,因此我发现了一种更好的方法来执行此操作。
WITH temp_cte AS (
SELECT mt.ID AS ID
, MAX(NAMED_STRUCT('Date', mt.Date, 'Value1', mt.value1, 'Value2', mt.Value2)) AS my_struct
FROM my_table mt
GROUP BY mt.ID
)
SELECT tt.ID AS ID
, tt.my_struct.Date AS Date
, tt.my_struct.Value1 AS Value1
, tt.my_struct.Value2 AS Value2
FROM temp_cte tt
;
关于hadoop - Hive - 删除重复项,保留最新记录 - 所有这些,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853227/