说你有客户的使用日期表如下:
[CUSTOMER_TABLE]的Oracle SQL以往X日选择不同的客户滚动周期
+----------+-----------+----------+
| customer | date | purchase |
+----------+-----------+----------+
| 1 | 1/01/2016 | 12 |
+----------+-----------+----------+
| 1 | 1/12/2016 | 3 |
+----------+-----------+----------+
| 2 | 5/03/2016 | 5 |
+----------+-----------+----------+
| 3 | 1/16/2016 | 6 |
+----------+-----------+----------+
| 3 | 3/22/2016 | 1 |
+----------+-----------+----------+
我想编写一个查询来算多少不同的客户在过去的10天内作为一个滚动周期进行了购买,从每个日历日开始计算并且向后计数10天。因此,对于每一个独特的一天在2016年最后的结果将是一个日历,其中的每一天都有存在类似下面的日历当天的10天前不同客户的计数:
[result_table]
+-----------+------------------+
| date | unique customers |
+-----------+------------------+
| 1/01/2016 | 112 |
+-----------+------------------+
| 1/02/2016 | 104 |
+-----------+------------------+
| 1/03/2016 | 140 |
+-----------+------------------+
| 1/04/2016 | 133 |
+-----------+------------------+
| .... | 121 |
+-----------+------------------+
我想出的一个解决方案是创建一个单列日历表,然后通过不平等连接将日历表连接到客户表。我相信这是非常低效的,并且正在寻求更快的解决方案。所以我的第一步是创建一个像这样一个日程表:
[日历]
+-----------+
| date |
+-----------+
| 1/01/2016 |
+-----------+
| 1/02/2016 |
+-----------+
| 1/03/2016 |
+-----------+
| 1/04/2016 |
+-----------+
| 1/05/2016 |
+-----------+
然后每天在日历,事先算组不同客户的每一天,我喜欢这样的不平等加盟:
select
count(distinct customer) as unique customers
from calendar c
left join mytable m
on c.date>=m.date and m.date>=c.date-10
虽然我认为这是正确的,但运行速度非常缓慢(比如说有两百万用户的日历)。有没有一个oracle分析函数可以帮助我在这里?
你能提供一些示例数据和输出?我有几个想法我想测试...... – BobC
总共有多少条记录在mytable中?桌上有几个不同的客户? – nop77svk
数据是敏感的对不起,我在两年的日历上运行这个不到1000万但超过500,000不同的客户。 – barker