[英]Get the last value of partition group in Hive query, but with additional requirements
假設我在一個表中有 3 列:id、flag、time。 Flag 只能是以下三個之一:A1、A2、B。
ID flag time
1 A1 2016-01-01
1 A2 2016-01-02
1 B 2016-01-03
1 B 2016-01-04
2 A1 2016-01-02
2 B 2016-01-03
2 A2 2016-01-04
2 B 2016-01-05
數據已按每個 ID 的時間排序。 現在我想得到,對於每個 ID,當標志等於 B 時,最后一個非 B 標志,例如:
1 B 2016-01-03 A2 2016-01-02
1 B 2016-01-04 A2 2016-01-02
2 B 2016-01-03 A1 2016-01-02
2 B 2016-01-05 A2 2016-01-04
這在 Hive 查詢中甚至可能嗎?
使用max
窗口函數獲取非 B 標志的運行最長時間。 然后join
這個結果與原始表以獲取相應的最大時間標志信息(標志B之前,對於給定的ID)。
SELECT X.*,
T.FLAG
FROM
(SELECT T.*,
MAX(CASE WHEN FLAG<>'B' THEN TIME END) OVER(PARTITION BY ID ORDER BY TIME) AS MAX_TIME_BEFORE_B
FROM T
) X
JOIN T ON T.ID=X.ID AND T.TIME=X.MAX_TIME_BEFORE_B
WHERE X.FLAG='B'
select id
,flag
,time
,A.flag as A_flag
,A.time as A_time
from (select id
,flag
,time
,max
(
case
when flag <> 'B'
then named_struct ('time',time,'flag',flag)
end
) over
(
partition by id
order by time
rows unbounded preceding
) as A
from t
) t
where flag = 'B'
;
+----+------+------------+--------+------------+
| id | flag | time | a_flag | a_time |
+----+------+------------+--------+------------+
| 1 | B | 2016-01-03 | A2 | 2016-01-02 |
| 1 | B | 2016-01-04 | A2 | 2016-01-02 |
| 2 | B | 2016-01-03 | A1 | 2016-01-02 |
| 2 | B | 2016-01-05 | A2 | 2016-01-04 |
+----+------+------------+--------+------------+
ps
time
)作為列名。time
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.