从3个空列中获取最小时间戳

dced5bon  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(291)

我有数据,至少 user_id 级别3时间戳(t1、t2、t3)。我想至少得到3个时间戳。我本可以写一个 CASE....WHEN 得到了最小值。
但我面临的问题是,任何列都可以有空值。那么我怎样才能克服 NULL 当得到最小值时
以下是数据

+---------+---------------------+---------------------+---------------------+
| user_id |         T1          |         T2          |         T3          |
+---------+---------------------+---------------------+---------------------+
|       1 | 2020-01-02 01:38:44 | 2020-01-03 12:38:44 | 2020-01-02 02:48:44 |
|       2 | 2020-01-06 01:38:44 | NULL                | NULL                |
|       3 | NULL                | 2020-01-02 14:38:44 | NULL                |
|       4 | 2020-02-05 13:38:56 | NULL                | 2020-02-02 14:38:56 |
|       5 | 2020-02-04 11:38:56 | 2020-02-05 11:38:56 | NULL                |
+---------+---------------------+---------------------+---------------------+

以下是预期结果

+---------+---------------------+
| user_id |      min_time       |
+---------+---------------------+
|       1 | 2020-01-02 01:38:44 |
|       2 | 2020-01-06 01:38:44 |
|       3 | 2020-01-02 14:38:44 |
|       4 | 2020-02-02 14:38:56 |
|       5 | 2020-02-04 11:38:56 |
+---------+---------------------+

小提琴

axzmvihb

axzmvihb1#

你可以用 least() 还有其他魔法:

select least( coalesce(t1, t2, t3),
              coalesce(t2, t3, t1),
              coalesce(t3, t1, t2)
            )

一般来说, least() 退货 NULL 如果任何一个论点 NULL . 然而, coalesce() 如果有有效的参数,将选择有效的参数。

xtfmy6hx

xtfmy6hx2#

我手头没有一个Hive数据库来尝试这个,但它在postgres中仍然有效,这在语法上非常接近。

SELECT 
    user_id,
    (SELECT min(v) FROM (VALUES (T1),(T2),(T3)) AS r(v)) as TheMin,
    T1,
    T2,
    T3
FROM 
   mytable;

结果:

+---------+---------------------+---------------------+---------------------+---------------------+
| user_id |       TheMin        |         T1          |         T2          |         T3          |
+---------+---------------------+---------------------+---------------------+---------------------+
|       1 | 2020-01-02 01:38:44 | 2020-01-02 01:38:44 | 2020-01-03 12:38:44 | 2020-01-02 02:48:44 |
|       2 | 2020-01-06 01:38:44 | 2020-01-06 01:38:44 | NULL                | NULL                |
|       3 | 2020-01-02 14:38:44 | NULL                | 2020-01-02 14:38:44 | NULL                |
|       4 | 2020-02-02 14:38:56 | 2020-02-05 13:38:56 | NULL                | 2020-02-02 14:38:56 |
|       5 | 2020-02-04 11:38:56 | 2020-02-04 11:38:56 | 2020-02-05 11:38:56 | NULL                |
+---------+---------------------+---------------------+---------------------+---------------------+

相关问题