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

Posted

技术标签:

【中文标题】SQL / Hive 选择具有特定列值的第一行【英文标题】:SQL / Hive Select first rows with certain column value 【发布时间】:2016-04-18 14:21:12 【问题描述】:

考虑以下三列表结构:

id, b_time, b_type

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

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

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

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

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

【问题讨论】:

【参考方案1】:

想出了一个简单直观的方法来做到这一点:

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

【讨论】:

【参考方案2】:
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

【讨论】:

以上是关于SQL / Hive 选择具有特定列值的第一行的主要内容,如果未能解决你的问题,请参考以下文章

选择最后一组连续行中的第一行

如何选择具有 MAX(列值)的第一行?

在 SQL 中选择具有唯一列值的行

从具有重复列值的集合中选择第一条记录 C#

Hive 查询以使用其他列值的总和获取前 3 列值

如何在数据工厂中获取 CSV 的第一行和第一列值?