【问题标题】:Customised ordering in Hive's row_number() over partition by order by window functionHive row_number() 中的自定义排序,按窗口函数排序
【发布时间】:2020-06-02 16:46:07
【问题描述】:

我有一个带有标识符列id 的表和另一个带有字符串值column_b 的列,我想在column_b 上进行客户订购。假设column_b 由值A、B、C、D 组成。

row_number() over() 在 Hive 中可以使用的语法是:

SELECT id, column_b, row_number() over(partition by id order by column_b) as row_id
FROM   some_table

example 的示例请参见此处

但是,我想在column_b 上进行自定义排序,而不是按字母排序。上面的语法会产生类似:

相反,我想使用A, C, D, B 的顺序明确地按 column_b 排序,即:

我怎样才能做到这一点?

【问题讨论】:

    标签: hive hiveql window-functions


    【解决方案1】:

    使用 case 语句明确指定顺序。您可以在order by 中使用其他标量函数:

    SELECT id, column_b, 
           row_number() over(partition by id order by case column_b
                                                           when 'A' then '1'
                                                           when 'C' then '2'
                                                           when 'D' then '3'
                                                           when 'B' then '4'
                                                           --add more cases
                                                           --for example other values sort
                                                           --in natural order  
                                                           else column_b 
                                                           --or use constant
                                                           --to make sure 
                                                           --everything else is greater than 4 
                                                           --like this  else concat('5',column_b)
                                                      end 
                             ) as row_id
      FROM some_table
    

    您也可以在子查询中计算订单列并在窗口中使用它,它的工作原理是一样的:

    SELECT id, column_b, 
           row_number() over(partition by id order by orderby) as row_id
      FROM (select t.*, 
                   case column_b
                        when 'A' then '1'
                        when 'C' then '2'
                        when 'D' then '3'
                        when 'B' then '4'  
                        else concat('5',column_b) 
                   end orderby
               from some_table t
            ) s
    

    【讨论】:

    • 完美运行,我更喜欢第一个版本,因为我认为它更容易阅读。
    【解决方案2】:

    请使用下面的简单查询,

    select id, column_b,row_id from
    (select id, column_b,row_id from table order by mod(row_id,2) != 0
    union all
    select id, column_b,row_id from table order by mod(row_id,2) = 0) qry;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2021-02-14
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      相关资源
      最近更新 更多