我正在使用presto。我有一個數字的ID字段。我想要一個在id內加上數字的列。所以如果ID = 1234,我想要一個輸出10即1 + 2 + 3 + 4的列。SQL總結數字的數字
我可以使用子字符串來提取每個數字並總結它,但是有沒有我可以使用的函數或更簡單的方法?
我正在使用presto。我有一個數字的ID字段。我想要一個在id內加上數字的列。所以如果ID = 1234,我想要一個輸出10即1 + 2 + 3 + 4的列。SQL總結數字的數字
我可以使用子字符串來提取每個數字並總結它,但是有沒有我可以使用的函數或更簡單的方法?
如果我正確地讀你的問題,你想避免硬編碼的ID字符串中的每個數字,如substring (ID,1,1) + substring (ID,2,1) + ...substring (ID,n,1)
。這是不雅觀的,只有當你的所有ID值長度相同時纔有效。
你可以做的是使用遞歸CTE。這樣做也適用於具有可變值長度的ID字段。
免責聲明:這不還是在技術上使用substring
,但它不會做笨拙的硬編碼搶
WITH recur (ID, place, ID_sum)
AS
(
SELECT ID, 1 , CAST(substring(CAST(ID as varchar),1,1) as int)
FROM SO_rbase
UNION ALL
SELECT ID, place + 1, ID_sum + substring(CAST(ID as varchar),place+1,1)
FROM recur
WHERE len(ID) >= place + 1
)
SELECT ID, max(ID_SUM) as ID_sum
FROM recur
GROUP BY ID
首先使用REGEXP_EXTRACT_ALL
分裂的字符串。然後使用CROSS JOIN UNNEST GROUP BY
將提取的數字按其編號進行分組並對它們進行求和。
這裏,
WITH my_table AS (SELECT * FROM (VALUES ('12345'), ('42'), ('789')) AS a (num))
SELECT
num,
SUM(CAST(digit AS BIGINT))
FROM
my_table
CROSS JOIN
UNNEST(REGEXP_EXTRACT_ALL(num,'\d')) AS b (digit)
GROUP BY
num
;
您可以從@ akuhn與最近添加到普雷斯托lambda支持答案結合regexp_extract_all
。這樣你就不需要unnest
。該代碼將是非常自我解釋,如果不是需要cast
往返varchar
:
presto> select
reduce(
regexp_extract_all(cast(x as varchar), '\d'), -- split into digits array
0, -- initial reduction element
(s, x) -> s + cast(x as integer), -- reduction function
s -> s -- finalization
) sum_of_digits
from (values 1234) t(x);
sum_of_digits
---------------
10
(1 row)
也許使用['slice'(https://prestodb.io/docs/current/functions/array.html)生成一個數組,然後簡單地總結數組中的值? – xQbert