2015-11-05 25 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