【发布时间】:2017-07-05 01:50:01
【问题描述】:
假设您有一张客户表,其日期如下:
[客户表]
+----------+-----------+----------+
| 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 天中存在的不同客户的计数,如下所示:
[结果表]
+-----------+------------------+
| 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
虽然我认为这是正确的,但它的运行速度非常慢(比如说,在拥有几百万客户的日历中运行 2 年)。有没有可以帮助我的预言机分析功能?
【问题讨论】:
-
你能提供一些示例数据和输出吗?我有一些想法想测试一下...
-
mytable共有多少条记录?表中有多少不同的客户? -
数据很敏感抱歉,我在 2 年的日历中运行了这个,只有不到 1000 万但超过 500,000 个不同的客户。
标签: sql oracle oracle11g window-functions analytic-functions