Sql 配置单元(查找一行中n列的最小值)
我在蜂箱中有一个表,有5列,即电子邮件、a_first_date、b_first_date、c_first_date、d_first_date a、 b、c、d是用户可以采取的4种不同行动,上表中的4列表示用户采取第一种相应行动的日期。例如,'a_first_date'中的值具有用户执行操作a的日期 输出:我想要的是有电子邮件的两列,总的第一天,即用户第一次行动的日期 示例表:(假设所有值都是BIGINT类型,而不是电子邮件) 电子邮件、a_首_日期、b_首_日期、c_首_日期、d_首_日期Sql 配置单元(查找一行中n列的最小值),sql,hadoop,hive,Sql,Hadoop,Hive,我在蜂箱中有一个表,有5列,即电子邮件、a_first_date、b_first_date、c_first_date、d_first_date a、 b、c、d是用户可以采取的4种不同行动,上表中的4列表示用户采取第一种相应行动的日期。例如,'a_first_date'中的值具有用户执行操作a的日期 输出:我想要的是有电子邮件的两列,总的第一天,即用户第一次行动的日期 示例表:(假设所有值都是BIGINT类型,而不是电子邮件) 电子邮件、a_首_日期、b_首_日期、c_首_日期、d_首_日期 美
美国广播公司,20140707201407022014080120407
xyz,2014010720140822014020120141007 输出: 电子邮件,总体首个日期
美国广播公司,20140702
xyz,20140107 可能的两种解决方案是编写一个UDF或使用IF-ELSE将这些值相互比较,然后找到最小值,但这将涉及大量比较 或者,我可以做一个:
select email, min(action) as overall_first_date from
(
select email, a_first_date as action from mytable
UNION ALL
select email, b_first_date as action from mytable
UNION ALL
select email, c_first_date as action from mytable
UNION ALL
select email, d_first_date as action from mytable
) q1
GROUP BY email
但这又不是一个好办法
有谁能提出更好的方法来实现这一点吗?为什么不使用案例陈述?这似乎已经在SQL中详细讨论过了:您可以使用Hive的数组函数:
select email,
sort_array(array(a_first_date, b_first_date, c_first_date, d_first_date))[0] as overall_first_date
from table;
我不确定这与CASE语句的性能相比如何。由于没有太多的列,这两个列都同样简单。使用函数least()。
例如
选择*、最小值(col1、col2、col3)作为minofcol
从表名开始 看看这个问题:这肯定比实际情况要简单得多。令人惊叹的!