SQL / Hive选择具有特定列值的第一行

时间:2016-04-18 14:21:13

标签: hive hiveql

考虑以下3列表结构:

id, b_time, b_type

id是一个字符串,表中将有多个具有相同ID的行。 b_time是时间戳,b_type可以包含2个可能值中的任何一个 - “A”或“B”。

我想选择满足以下两个条件之一的所有行,优先级:

  1. 对于所有ID,请选择时间戳最高的行,其中b_type ='A'。

  2. 如果对于id,没有b_type ='A'的行,请选择时间戳最高的行,而不考虑b_type值。

  3. 请建议应该解决此问题的sql查询(即使它需要创建临时中间表)。

2 个答案:

答案 0 :(得分:2)

找出一种简单直观的方法:

SELECT * FROM     
  (SELECT id
    , b_time
    , b_type
    , ROW_NUMBER() OVER (PARTITION BY id ORDER BY b_type ASC,b_time DESC) AS RN
    FROM your_table
  )    
WHERE RN = 1

答案 1 :(得分:0)

with nottypea as (select id, max(b_time) as mxtime 
                  from tablename 
                  group by id 
                  having sum(case when b_type = 'A' then 1 else 0 end) = 0)
, typea as (select id, max(b_time) as mxtime 
            from tablename 
            group by id 
            having sum(case when b_type = 'A' then 1 else 0 end) >= 1)
select id,mxtime,'B' as typ from nottypea
union all
select id,mxtime,'A' as typ from typea