2017-02-01 12 views
1

我有一个如下所示的表,它具有开始范围和结束范围列。生成范围和递减程序的序列号

+------+----------+--------+--+ 
| f1 | start_r | end_r | 
+------+----------+--------+--+ 
| ABC | 31  | 29  | 
+------+----------+--------+--+ 

我需要在start_r和end_r使用的值,并产生如下面的输出(产生减1的开始和结束范围之间的序列号)

f1 seq_no 

ABC 31 
ABC 30 
ABC 29 

我只需要一种方法为了生成值..是否有蜂房中的任何buitin功能呢?

回答

1

编辑:
替换split(space(start_r - end_r - 1),'')
split(space(start_r - end_r),' ')

select t.f1 
     ,t.start_r - pe.i as seq_no 

from (select 'ABC' as f1,31 as start_r,29 as end_r)    t 
     lateral view posexplode(split(space(start_r - end_r),' ')) pe as i,s 
; 

hive> select t.f1,t.start_r - pe.i as seq_no from (select 'ABC' as f1,31 as start_r,29 as end_r) t lateral view posexplode(split(space(start_r - end_r - 1),'')) pe as i,s; 
OK 
ABC 31 
ABC 30 
ABC 29 

与您的桌面替换(select 'ABC' as f1,31 as start_r,29 as end_r)

+0

Dudu Markovitz, 我只有2行... 29失踪..! ABC 31 ABC 30' –

+0

有趣。正如你所看到的,我已经测试了代码。请告诉我'select split(空间(31 - 29 - 1),'');' –

+0

+'hive --version' –

0

请使用以下查询 ;具有N(N)AS ( SELECT 31
UNION ALL SELECT n-1 FROM n WHERE 29 ) SELECT n FROM n ORDER BY n DES OPTION(MAXRECURSION 1000);

+0

Hive,而不是SQL Server –