SQL:一列+计数的组合

时间:2014-01-09 12:14:46

标签: sql count group-by teradata

我有一个包含userID及其操作的源表(条目是不同的)

  

userID |动作

  1     A
  1     B
  2     A
  3     B
  3     C

我需要将两个操作的所有组合与执行这两个操作的用户数量一起获得。

  

动作1 | 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 个答案:

答案 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匹配同一行的情况。在上面的SQL中我假设sourceTable有一个PK我称之为RowID并排除了它加入的情况一排自己。 我也改变了HAVING行,因为这似乎不是你对问题的描述所要求的:它听起来好像在WHERE子句中更好。新的HAVING子句实际上是多余的:它的计数(*)永远不会为0,但它不会受到伤害。