[英]hadoop hive using row_number()
我有一個包含許多重復 ID 的數據集。 我只想做一個 row_number() 並取第一個。 如果我將 table1 與 table2 左連接並且只使用 table2.rownumber=1,它就可以工作。 但如果我在沒有表連接的情況下進行獨立操作,則不會。 我有以下代碼:
SELECT ID, NAME, NRIC, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) as RNK FROM TABLE1 WHERE RNK=1;
錯誤消息顯示 RNK 不是有效的表列或別名等。
任何幫助將不勝感激。 謝謝。
您必須使用子查詢或 CTE 來引用列別名以進行過濾:
SELECT ID, NAME, NRIC, RNK
FROM (SELECT t1.*, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) as RNK
FROM TABLE1
) t1
WHERE RNK = 1;
即使由窗口函數定義,所有列別名也是如此。
鑒於:
create table dupes (
id string,
democode string,
extract_timestamp string
);
和:
insert into dupes (id, democode,extract_timestamp) values
('1','code','2020')
,('2','code2','2020')
,('2','code22','2021')
,('3','code3','2020')
,('3','code33','2021')
,('3','code333','2012')
;
什么時候:
SELECT id,democode,extract_timestamp
FROM (
SELECT id,democode,extract_timestamp,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY extract_timestamp DESC) AS row_num
FROM dupes
) t1
WHERE row_num = 1;
然后:
+-----+-----------+--------------------+--+
| id | democode | extract_timestamp |
+-----+-----------+--------------------+--+
| 1 | code | 2020 |
| 2 | code22 | 2021 |
| 3 | code33 | 2021 |
+-----+-----------+--------------------+--+
請注意,表通常是分區的,我們可能希望在每個分區內進行重復數據刪除。 在這種情況下,我們會將分區鍵添加到OVER
語句中。 例如,如果表是按report_date DATE
分區的,那么我們可以使用:
ROW_NUMBER() OVER (PARTITION BY id, report_date ORDER BY extract_timestamp DESC) AS row_num
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.