說你有客戶的使用日期表如下:
[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