Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 配置单元(查找一行中n列的最小值)_Sql_Hadoop_Hive - Fatal编程技术网

Sql 配置单元(查找一行中n列的最小值)

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_首_日期 美

我在蜂箱中有一个表,有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
从表名开始

看看这个问题:这肯定比实际情况要简单得多。令人惊叹的!