计算具有多个条件的列的许多不同组合

Posted

技术标签:

【中文标题】计算具有多个条件的列的许多不同组合【英文标题】:Count many distinct combinations of columns with multiple conditions 【发布时间】:2016-06-08 01:56:37 【问题描述】:

我有一个名为fact_interactions 的表格,其中包含客户互动的运行历史记录。每次联系客户时,都会创建一条新记录,其中包含有关交互的特定详细信息。这是一个例子:

inter_id |customer_id |business_id |department_id |datetime_local      |outcome_id |
---------|------------|------------|--------------|--------------------|-----------|
46032383 |1           |112         |1916          |2015-01-14 19:54:20 |48         |
55740863 |2           |2           |3358          |2015-05-06 12:02:12 |19         |
49512895 |3           |160         |396           |2015-01-22 11:57:17 |19         |
51822751 |3           |160         |396           |2015-01-28 13:46:19 |19         |
23533190 |4           |132         |425           |2015-03-26 12:42:24 |19         |
69354240 |5           |164         |3061          |2015-03-30 11:01:43 |19         |
61417848 |5           |164         |3061          |2015-04-01 14:36:30 |19         |
74948424 |5           |164         |3061          |2015-04-28 15:12:42 |19         |
75303296 |5           |164         |3061          |2015-04-29 13:51:02 |10         |
76071776 |5           |164         |3061          |2015-05-01 09:18:39 |10         |

对于每条记录,我需要跨多个时间窗口查找与多个条件匹配的所有行。这是我的查询示例,其中包含我目前正在使用的一些不同子查询:

SELECT
    inter_id,
    (SELECT COUNT(*) FROM fact_interactions B
      WHERE B.customer_id = A.customer_id
      AND   B.business_id = A.business_id
      AND   B.department_id = A.department_id
      AND   B.datetime_local::date = A.datetime_local::date
      AND   B.datetime_local < A.datetime_local) AS cnt_samesamesame_day0
    (SELECT COUNT(*) FROM fact_interactions B
      WHERE B.customer_id = A.customer_id
      AND   B.business_id = A.business_id
      AND   B.department_id <> A.department_id
      AND   B.datetime_local::date = A.datetime_local::date
      AND   B.datetime_local < A.datetime_local) AS cnt_samesamediff_day0
    (SELECT COUNT(*) FROM fact_interactions B
      WHERE B.customer_id = A.customer_id
      AND   B.business_id <> A.business_id
      AND   B.department_id <> A.department_id
      AND   B.datetime_local::date = A.datetime_local::date
      AND   B.datetime_local < A.datetime_local) AS cnt_samediffdiff_day0
FROM fact_interactions A;

对于我要计算的计数,我总共有 180 个子查询。因此,如果 fact_interaction 有 1,000,000 条记录,则输出也将有 1,000,000 条记录,但会有 inter_id 加上 180 个计数列。以下是这 180 个计数子查询将被命名的一些示例,以提供进一步的解释:

cnt_samesamesame_day0/day3/day7/... cnt_samesamediff_day0/day3/day7/... cnt_samediff_day0/day3/day7/...

查询能够完成,但您可以想象它需要 非常 很长时间。仅计算 cnt_samesamesame_day0 就需要一分钟。

很难包含输出的样例,因为它非常稀疏。

关于如何更有效地做到这一点的任何建议?非常感谢具体示例,但即使是更好的通用方法也会令人惊叹。谢谢!

(我正在尝试在 Amazon Redshift 集群上实现此功能)

【问题讨论】:

【参考方案1】:

我可能建议您学习窗口函数。例如:

SELECT inter_id,
       COUNT(*) OVER (PARTITION BY customer_id, business_id, department_id, department_id, datetime_local
                      ORDER BY datetime_local
                     ) as cnt_samesamesame_day0,
       . . . 

其他列可能有类似的结构。

【讨论】:

以上是关于计算具有多个条件的列的许多不同组合的主要内容,如果未能解决你的问题,请参考以下文章

当它们具有不同的列集时,按行组合两个数据帧(rbind)

具有唯一值的列的 SQL 总和量

Python Pandas - 具有不同列的 Concat 数据框忽略列名

如何让多个不同的SQL语句一起执行?

如何使用“OR”组合多个条件以对数据框进行子集化?

Excel:通过多个工作表进行相关的下拉计算(具有不同的列位置)