我在 BQ 有一張桌子
WITH tbl_campaign_ipmapping AS
(
SELECT 'advertiser1' as advertiser, 'campaign1' as campaign, ['10.0.0.0','20.0.0.0','30.0.0.0', '40.0.0.0'] AS ip_array UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign2' as campaign, ['10.0.0.0', '20.0.0.0', '50.0.0.0'] UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign3' as campaign, ['10.0.0.0', '40.0.0.0', '60.0.0.0', '70.0.0.0', '80.0.0.0'] UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign4' as campaign, ['10.0.0.0', '20.0.0.0', '30.0.0.0'] UNION ALL
SELECT 'advertiser2' , 'campaign1' , ['10.1.1.1','20.1.1.1','30.1.1.1', '40.1.1.1'] UNION ALL
SELECT 'advertiser2' , 'campaign2' , ['10.1.1.1', '20.1.1.1', '50.1.1.1'] UNION ALL
SELECT 'advertiser2' , 'campaign3' , ['10.1.1.1', '40.1.1.1', '60.1.1.1', '70.1.1.1', '80.1.1.1'] UNION ALL
SELECT 'advertiser2', 'campaign4' , ['10.1.1.1', '20.1.1.1', '30.1.1.1']
) select * from tbl_campaign_ipmapping
對于輸入廣告商來說,要實作的邏輯取決于對于每一行檢索 IP 串列并將它們與所有其他行(不包括當前行)中的 IP 進行比較,并列印不存在的 IP。
所以預期的輸出是
advertiser1, campaign1, ['50.0.0.0', '60.0.0.0', '70.0.0.0']
advertiser1,campaign2, ['30.0.0.0', '40.0.0.0', '60.0.0.0', '70.0.0.0']
advertiser1,campaign3, ['20.0.0.0','30.0.0.0', '50.0.0.0' ]
advertiser1,campaign4, ['40.0.0.0', '50.0.0.0', '60.0.0.0', '70.0.0.0'
實際上我不需要陣列只需要計數。剛剛在上面的輸出中列出了陣列以闡明邏輯。
uj5u.com熱心網友回復:
您可以嘗試使用另一個 CTE 來查找所有可能的 IP,然后再使用此串列來收集當前 ip 陣列之外的所有其他 ip,例如
WITH tbl_campaign_ipmapping AS
(
SELECT 'advertiser1' as advertiser, 'campaign1' as campaign, ['10.0.0.0','20.0.0.0','30.0.0.0', '40.0.0.0'] AS ip_array UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign2' as campaign, ['10.0.0.0', '20.0.0.0', '50.0.0.0'] UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign3' as campaign, ['10.0.0.0', '40.0.0.0', '60.0.0.0', '70.0.0.0', '80.0.0.0'] UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign4' as campaign, ['10.0.0.0', '20.0.0.0', '30.0.0.0'] UNION ALL
SELECT 'advertiser2' , 'campaign1' , ['10.1.1.1','20.1.1.1','30.1.1.1', '40.1.1.1'] UNION ALL
SELECT 'advertiser2' , 'campaign2' , ['10.1.1.1', '20.1.1.1', '50.1.1.1'] UNION ALL
SELECT 'advertiser2' , 'campaign3' , ['10.1.1.1', '40.1.1.1', '60.1.1.1', '70.1.1.1', '80.1.1.1'] UNION ALL
SELECT 'advertiser2', 'campaign4' , ['10.1.1.1', '20.1.1.1', '30.1.1.1']
),
all_ips AS (
SELECT DISTINCT ip
FROM tbl_campaign_ipmapping, unnest(ip_array) ip
WHERE advertiser='advertiser1'
)
select
advertiser ,
campaign,
ARRAY(
SELECT i.ip
FROM all_ips i
WHERE i.ip NOT IN (
SELECT ipa FROM UNNEST(t.ip_array) ipa
)
) as other_ips
from
tbl_campaign_ipmapping t
WHERE advertiser='advertiser1'
或者加入一個包含所有可能 ips 的表(你也可以考慮實作 all_ips)例如
WITH tbl_campaign_ipmapping AS
(
SELECT 'advertiser1' as advertiser, 'campaign1' as campaign, ['10.0.0.0','20.0.0.0','30.0.0.0', '40.0.0.0'] AS ip_array UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign2' as campaign, ['10.0.0.0', '20.0.0.0', '50.0.0.0'] UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign3' as campaign, ['10.0.0.0', '40.0.0.0', '60.0.0.0', '70.0.0.0', '80.0.0.0'] UNION ALL
SELECT 'advertiser1' as advertiser, 'campaign4' as campaign, ['10.0.0.0', '20.0.0.0', '30.0.0.0'] UNION ALL
SELECT 'advertiser2' , 'campaign1' , ['10.1.1.1','20.1.1.1','30.1.1.1', '40.1.1.1'] UNION ALL
SELECT 'advertiser2' , 'campaign2' , ['10.1.1.1', '20.1.1.1', '50.1.1.1'] UNION ALL
SELECT 'advertiser2' , 'campaign3' , ['10.1.1.1', '40.1.1.1', '60.1.1.1', '70.1.1.1', '80.1.1.1'] UNION ALL
SELECT 'advertiser2', 'campaign4' , ['10.1.1.1', '20.1.1.1', '30.1.1.1']
),
all_ips AS (
SELECT DISTINCT ip
FROM tbl_campaign_ipmapping, unnest(ip_array) ip
WHERE advertiser='advertiser1'
)
select
advertiser,
campaign,
ARRAY_AGG(i.ip) as other_ips
from
tbl_campaign_ipmapping t
inner join
all_ips i on i.ip NOT IN UNNEST(t.ip_array)
WHERE advertiser='advertiser1'
group by
advertiser,campaign
讓我知道這是否適合您
uj5u.com熱心網友回復:
考慮以下方法
with advertiser_ips as (
select advertiser, array_agg(distinct ip) ip_array
from tbl_campaign_ipmapping, unnest(ip_array) ip
group by advertiser
)
select advertiser, campaign,
array( select distinct ip
from b.ip_array ip
where not ip in unnest(a.ip_array)
) as missing_ip
from tbl_campaign_ipmapping a
join advertiser_ips b
using(advertiser)
如果應用于您問題中的樣本資料 - 輸出是

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/324129.html
標籤:sql 数组 谷歌-bigquery 区别
