2015-11-05 24 views
0

我想printf()只是collect_set()患者编号中的前3位患者。使用printf函数在collect_set数组中打印有限数量的元素

A。我已创建 “patient_list” 使用collect_set

collect_set(distinct patient_seq) AS patient_list 

其产生不同长度的患者编号的阵列(4,5或6位数字)

实施例:

["16189","26599","406622","419117","5551"] 
["223587","224663","232072","326504","433430","436673","54540","58188","74118"] 

。然后我剥出逗号和报价和(为了抢只是第3个例,在接下来的步骤)由“*”分隔:

concat_ws('*', patient_list) AS pat_list 

这产生:

16189*26599*406622*419117*5551 
223587*224663*232072*326504*433430*436673*54540*58188*74118 

Ç。我尝试使用SUBSTRING_INDEX()创建一个新变量(pat_list_short),其中只包含前3名患者,,但此功能在配置单元1.1.0(不支持,直到1.3.0)不支持。

substring_index(pat_list, '*', 3) AS pat_list_short 

我还有什么其他选择?

我想使用%s将pat_list_short输入到PRINTF中,以便仅打印评估团队的前三个患者编号。由于患者NUM在长度上变化,我不能只是限制打印到一定长度

感谢

回答

0

使用您提供

-------------- 
key | pat_id 
-------------- 
1  16189 
1  26599 
1  406622 
1  419117 
1  5551 
2  223587 
2  224663 
2  232072 
2  326504 
2  433430 
2  436673 
2  54540 
2  58188 
2  74118 

数据您可以使用此UDF here截断数组所需的长度。有关于如何构建和使用罐子的说明,请参见main page

查询

add jar /path/to/jar/brickhouse-0.7.1.jar; 
create temporary function trunc_array as 'brickhouse.udf.collect.TruncateArrayUDF'; 

select key 
    , concat(' ', trunc_array(collect_set(pat_id), 3)) pat_list_short 
from db.tbl 
group by key 

输出

---------------------- 
key | pat_list_short 
---------------------- 
1  5551 26599 16189 
2  232072 58188 223587 

我必须承认我有点不清楚了如何printf()起着这个问题的一部分作为查询返回结果并打印出来。同样值得注意的是,在A的查询中,collect_set(distinct)中的distinct是冗余的,因为collect_set的目的是收集不同的元素。

+0

谢谢GoBrewers。使用print()是因为我们有一段文本,其中pat_list_short只是需要打印的许多数据点之一以供客户端审阅。我会尝试trunc_array。我的工作围绕昨天是做到以下几点:SELECT商务 省 ,CONCAT_WS(””,SORT_ARRAY(COLLECT_SET(patient_seq)))AS patseq_list FROM( SELECT DISTINCT商务 省 ,patient_seq ,ROW_NUMBER( )OVER(按商品分类,提供ORDER BY patient_seq)AS pat_seq_order FROM pat_table )a WHERE pat_seq_order <= 3 GROUP BY Biz,prov; – Jane