2015-11-05 69 views
1

想象一個表有兩列如下:查找產品之間的共同賬戶的重複計數

Account_ID (integer) 
Product_ID (integer) 

其他列並不重大。這列出了通過帳戶購買的產品。我想創建一個三列的輸出,像這樣:

Account_ID_1 | Account_ID_2 | Count(distinct product_ID) 

結果應該讓每個ACCOUNT_ID組合中Account_IDs的所有值的組合,共同Product_Ids相關的重複計數。我正在使用Google BigQuery。有沒有一種SQL方法來做到這一點,或者我應該計劃使用完整的編程語言進行編碼嗎?

+0

我做不知道Google bigquery,但看看[CROSS JOIN](http://www.w3resource.com/sql/joins/cross-join.php) – Rik

+0

因此,如果兩個帳戶具有相同的'product_id' count()是1,並且只有一個擁有它0?或者與account1 +不同於account2? –

+0

你想要計數0嗎? –

回答

0

這個工作對我來說:

select 
    t1.Account_ID, T2.Account_ID, count(t1.Product_ID) count_product_id 
from 
    MYTABLE t1 join MYTABLE t2 on t1.Product_ID = t2.Product_ID 
where t1.Account_ID <> t2.Account_ID 
group by t1.Account_ID, t2.Account_ID 
order by 1,2 
+0

應該是:其中t1.Account_ID

+0

同意。 「<>」會給你一行帳戶A和B,另一行帳戶B和A.在這種情況下沒有意義,因爲計數是相同的。 「<」將確保您只有一次獲得A/B組合。 –

1

這裏我計算兩個帳戶在comon中有多少產品。

SELECT 
    T1.Account_ID as Account_ID_1, 
    T2.Account_ID as Account_ID_2, 
    COUNT(distinct T1.product_id) 

From YourTable as T1 
JOIN YourTable as T2 
    ON T1.Account_ID < T2.Account_ID 
AND T1.product_ID = T2.product_ID 
GROUP BY 
    T1.Account_ID, 
    T2.Account_ID 
0

的BigQuery的版本:

(的連接只在平等,同時保持<在WHERE子句)

SELECT a.corpus, b.corpus, EXACT_COUNT_DISTINCT(a.word) c 
FROM 
(SELECT corpus, word FROM [publicdata:samples.shakespeare]) a 
JOIN 
(SELECT corpus, word FROM [publicdata:samples.shakespeare]) b 
ON a.word=b.word 
WHERE a.corpus>b.corpus 
GROUP BY 1, 2 
ORDER BY 4 DESC 
+0

這正是我需要的查詢!非常感謝你。查詢處理samples.shakespeare,但我的表似乎太大了。錯誤說:Shuffle達到表__I0的廣播限制(廣播至少151001878字節)。考慮使用分區連接而不是廣播連接。 有什麼想法? – BAA

+0

做一個JOIN EACH(如果這是適合你的答案,你爲什麼接受另一個?) –