回答

收藏

Hive(连续查找n列中最小值)

技术问答 技术问答 192 人阅读 | 0 人回复 | 2023-09-13

我在Hive中有一个具有5列的表,即电子邮件,a_first_date,b_first_date,c_first_date,d_first_date。. J/ O7 y" j6 j, x
a,b,c,d它是用户可以采用的四种不同操作,上表中的四列指示用户执行第一个相应操作的日期。“ a_first_date”中0 A: a4 u) Y3 {  t' F# H
用户执行操作的值a的日期。, W% F3 k; H* I0 N$ s
输出:我想要的是2列包含电子邮件的内容,即total_first_date,也就是说,用户在什么日期执行了他的第一个操作?
0 E! M2 h/ i7 ?) ?示例假设所有值都是电子邮件以外的BIGINT类型). a! r' A3 H' l# j
电子邮件,a_first_date,b_first_date,c_first_date,d_first_date  abc,20140707,20140702,20140801,20140907  xyz,20140107,20140822,20140201,20141007
6 `8 k8 n5 G4 N$ @* B4 B: q输出:
6 O3 g- a! |+ ^# @8 T8 ^  z) C( y电子邮件,overall_first_date  abc,20140702  xyz,20140107
* Q% O* I3 N8 T  \  `几个可能的解决方案是编写UDF或使用IF ELSE比较这些值,然后找到最小值,但这涉及到很多比较。, @( j6 U. S# p8 x' b. B% L* _% Y
或者,我可以执行以下操作:
  e3 v$ ~. g- v$ Z- Yselect email,min(action) as overall_first_date from(select email,a_first_date as action from mytableUNION ALLselect email,b_first_date as action from mytableUNION ALLselect email,c_first_date as action from mytableUNION ALLselect email,d_first_date as action from mytable) q1GROUP BY email但这不是一个好办法。
9 V0 ~- ^. c$ J( y任何人都能提出更好的方法来实现这一目标吗?
+ K- C, \+ |" p: c- f* [8 M5 p                                                                ; i, W" L/ k5 R! K4 ]" h4 A
    解决方案:                                                                ; \# k/ p* E2 a" `3 l9 E8 S
                                                                为什么不用?case句子?这似乎已经存在了SQL详细讨论:https://dba.stackexchange.com/questions/21542/what-is-the-most-efficiency-way-/ k' Y! p) e9 c; D  y8 u
to-get-the-minimum-of-multiple-& ~9 Y0 t5 ^/ P; g% p
columns在SQL服务器上
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则