计算具有多个条件的列的许多不同组合
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
就需要一分钟。
很难包含输出的样例,因为它非常稀疏。
关于如何更有效地做到这一点的任何建议?非常感谢具体示例,但即使是更好的通用方法也会令人惊叹。谢谢!
(我正在尝试在 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,
. . .
其他列可能有类似的结构。
【讨论】:
以上是关于计算具有多个条件的列的许多不同组合的主要内容,如果未能解决你的问题,请参考以下文章