我有一個包含這些陣列的表:
身份證 | ids_positions | ids_position_exceptions |
---|---|---|
[A1、A2、A3、A4、A5] | [0, 1, 2, 3, 4] | [2, 3] |
[A1、A2、A3、A4] | [0, 1, 2, 3] | [0] |
ids和ids_positions將始終具有相同的長度。基本上ids_positions包含ids的每個元素的索引
ids_positions將始終按升序排列,從 0 到數字 n。
ids_position_exceptions包含 ids_positions 中的一些數字,這些數字應在最終結果中排除(有時此陣列可能為空,因此不應進行排除)
我需要這個:
ID | 職位 |
---|---|
A1 | 0 |
A2 | 1 |
A3 | 4 |
A4 | 5 |
A5 | 6 |
A1 | 1 |
A2 | 2 |
A3 | 3 |
A4 | 4 |
我必須逐行分解沒有 array_exceptions 中的元素的 array_positions 并添加新值以繼續序列。
例如,在第一行,我有 5 個 ID。有兩個例外,所以我必須洗掉它們并在最后添加相同數量的元素。我洗掉了 2 和 3,并添加了 5 和 6。
我在想這樣的事情:如果生成的序列的一個元素在array_exception中,則生成一個從0到ids_positions ids_position_exceptions長度的陣列。然后將這個新陣列分解成一列。
如果 BigQuery 有一個像 SparkSQL 這樣的 ARRAY_EXCEPT 函式,我想知道,但我認為這是我在這種情況下所需要的。
這是一個大資料問題,所以解決方案必須具有成本效益
謝謝!
uj5u.com熱心網友回復:
下面使用
select id, position from your_table t, t.array_positions position
except distinct
select id, exception from your_table t, t.array_exceptions exception
如果應用于您問題中的樣本資料 - 輸出是
以下是更新問題的答案
select id, position from (
select ids, array(
(select * from t.ids_positions except distinct select * from t.ids_position_exceptions)
union all
select array_length(ids_positions) i - 1
from unnest(generate_array(1, array_length(ids_position_exceptions))) i
) new_positions
from your_table t
), unnest(ids) id with offset
join unnest(new_positions) position with offset
using(offset)
帶輸出
uj5u.com熱心網友回復:
使用集合操作看起來很棒,下面是另一個沒有集合操作的可能選項。
SELECT id, p AS positions
FROM sample, UNNEST(array_positions) p
WHERE p NOT IN UNNEST(array_exceptions)
輸出:
以下查詢是針對您更新的問題:
SELECT id, position
FROM (
SELECT *,
ARRAY_LENGTH(array_exceptions) AS len_ex,
(SELECT AS STRUCT MAX(p) maxpos, ARRAY_AGG(p) pos
FROM UNNEST(array_positions) p
WHERE p NOT IN UNNEST(array_exceptions)) AS ex
FROM sample
),
UNNEST(ids) id WITH OFFSET JOIN
UNNEST(ARRAY_CONCAT(
ex.pos,
GENERATE_ARRAY(ex.maxpos 1, ex.maxpos len_ex)
)) position WITH OFFSET USING (offset)
;
uj5u.com熱心網友回復:
我不確定您的資料大小,但我會在 bigquery 上采用
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494828.html
上一篇:為什么超出范圍的索引不會為RegexGroupCollection拋出例外?
下一篇:為什么要呼叫RestTemplate.class的handleResponse(URIurl,HttpMethodmethod,ClientHttpResponseresponse)方法以獲得200成