hive sql从具有优先级条件的表中选择

时间:2017-08-22 15:19:45

标签: sql hiveql

我想从名为name的表格中选择nametypenames,但要优先考虑nametype

table names

name        nametype    address    id
simon           01       xx         1
simon           02       xx         2 
simon           03       xx         3 
karen           01       xx         4
william         03       xx         5 
william         01       xx         6
william         02       xx         7

我想编写一个查询,按照排序顺序选择name = nametype = 01或02或03 nametype。 我只想要{{1}} = 01的行,其他2行不应该 地选择。

如何在sql中实现这一点,我需要了解如何标记已经选择的名称。

2 个答案:

答案 0 :(得分:1)

如果您只想要where行,请使用select t.* from t where t.nametype = '01';

nametype

如果您希望行的最小值为where(这似乎是您的问题的意图),请使用窗口函数和min()。一种方法使用select t.* from (select t.*, min(t.nametype) over (partition by name) as min_nametype from t ) t where nametype = min_nametype;

#include <cmath>
#include <iostream>
#include <limits>

void main()
{
  double val = exp(-10.240990982718174);
  std::cout.precision(std::numeric_limits<double>::max_digits10);
  std::cout << val;
}

答案 1 :(得分:0)

使用合并

来管理我的自我
pseudocode:

if nametypes = OECD207
     select row
 elseif nametypes = OECD203
     select row
 elseif nametypes =OECD204
     select row
end if

OECD207 OECD203 OECD204 ... 作为优先列表

select
navn
, coalesce(OECD207, OECD203, OECD204, ...) as nametype 
from
(
select
navn
, max(case when nametype = "OECD207" then nametype else null end) as OECD207
, max(case when nametype = "OECD203" then nametype else null end) as OECD203
, max(case when nametype = "OECD204" then nametype else null end) as OECD204
...
from ...
group by
navn
)