2014-01-09 57 views
0

我有一個包含用戶ID和他們的行動(條目是不同的)SQL:一列的組合+計數

用戶ID源表|行動

1  A 
    1  B 
    2  A 
    3  B 
    3  C 

,我需要與誰進行兩個動作的用戶數量獲得的兩個動作都組合在一起。

action1 | action2 |用戶

A  A  2 
    A  B  1 
(A  C  0) 
    B  B  2 
    B  C  1 
    C  C  1 
  • A-C的數量是在括號,因爲我不需要在含有0個用戶的輸出行。
  • 包含兩次相同操作(A-A)的行只存儲執行該操作的用戶數。 (用戶1和用戶2執行的動作A,這是2個用戶)

我試圖加入源表本身,而是因爲它包含了比行的百萬,我跑出來的閥芯空間:

SELECT sT1.action, sT2.action, count(distinct sT1.userID) 
FROM sourceTable sT1 
JOIN sourceTable sT2 ON (sT1.userID=sT2.userID) 
GROUP BY 1,2 
HAVING sT1.action <= sT2.action 

輸出本身不應該太大,因爲大多數組合不會存在(0個用戶同時執行這兩個操作)。 有沒有更有效的方式來查詢我需要什麼?

預先感謝您。

回答

1
SELECT sT1.action, sT2.action, count(*) 
FROM sourceTable sT1 
LEFT INNER JOIN sourceTable sT2 ON (sT1.userID=sT2.userID) 
where (st1.RowID <> st1.RowID) 
and sT1.action <= sT2.action 
GROUP BY st1.action, st2.action 
HAVING count(*) > 0 

唯一的問題,這是你需要放棄其中ST1和ST2的匹配相同row.In的SQL上面我已經假定sourceTable會擁有PK我叫行ID和排除的情況下情況下,它加入自己的行。 我也改變了HAVING行,因爲這似乎不是你所要求的問題描述:它聽起來像是在WHERE子句中更好。新的HAVING子句實際上是多餘的:它永遠不應該有一個0的計數(*),但它不會傷害。

+0

我不知道這是否會解決它,但它看起來非常複雜:D –

+0

感謝您的回覆! 我不能做RowID <> RowID,因爲我也需要連接到自己的行。在WHERE子句中使用動作<=動作有所幫助,看起來這比在HAVING部分做得更好。除此之外,您的查詢看起來與我的非常相似。 我希望有一個不使用連接的解決方案,但也許這是不可能的。 – user3177113

+0

您必須使用加入。在世界上沒有一個嚴肅的問題沒有 - 加入沒有任何問題! –