如果你只想要一個前瞻性的或向後看的日期差異衡量標準,我認爲你可以用一個簡單的滯後/主導方法來做到這一點。
select * from table1 order by cust_num, sale_date;
UNIQUE_PRIMARY_KEY | CUST_NUM | SALE_DATE
--------------------+----------+------------
7 | 1 | 2014-10-06
2 | 1 | 2014-10-12
5 | 1 | 2014-10-14
1 | 1 | 2014-10-17
4 | 1 | 2014-10-19
3 | 1 | 2014-10-22
6 | 1 | 2014-10-25
100008 | 5 | 2014-10-07
300002 | 5 | 2014-10-13
100006 | 5 | 2014-10-15
200003 | 5 | 2014-10-18
200004 | 5 | 2014-10-20
100005 | 5 | 2014-10-23
100007 | 5 | 2014-10-26
則...
在你希望它是日期差的ABS更可能的情況下,我的大腦仍然希望使用滯後&領先,但streatching到其可悲的能力,並有一個更爲複雜的方式這樣拼湊的:
WITH foo AS
(
SELECT UNIQUE_PRIMARY_KEY pk,
cust_num,
sale_date,
lead(sale_date,1) over (partition BY cust_num ORDER BY sale_date) rel_sales_date,
ABS(sale_date - lead(sale_date,1) over (partition BY cust_num ORDER BY sale_date)) day_delta
FROM table1
UNION ALL
SELECT UNIQUE_PRIMARY_KEY pk,
cust_num,
sale_date,
lead(sale_date,2) over (partition BY cust_num ORDER BY sale_date) rel_sales_date,
ABS(sale_date - lead(sale_date,2) over (partition BY cust_num ORDER BY sale_date)) day_delta
FROM table1
UNION ALL
SELECT UNIQUE_PRIMARY_KEY pk,
cust_num,
sale_date,
lead(sale_date,3) over (partition BY cust_num ORDER BY sale_date) rel_sales_date,
ABS(sale_date - lead(sale_date,3) over (partition BY cust_num ORDER BY sale_date)) day_delta
FROM table1
UNION ALL
SELECT UNIQUE_PRIMARY_KEY pk,
cust_num,
sale_date,
lag(sale_date,1) over (partition BY cust_num ORDER BY sale_date) rel_sales_date,
ABS(sale_date - lag(sale_date,1) over (partition BY cust_num ORDER BY sale_date)) day_delta
FROM table1
UNION ALL
SELECT UNIQUE_PRIMARY_KEY pk,
cust_num,
sale_date,
lag(sale_date,2) over (partition BY cust_num ORDER BY sale_date) rel_sales_date,
ABS(sale_date - lag(sale_date,2) over (partition BY cust_num ORDER BY sale_date)) day_delta
FROM table1
UNION ALL
SELECT UNIQUE_PRIMARY_KEY pk,
cust_num,
sale_date,
lag(sale_date,3) over (partition BY cust_num ORDER BY sale_date) rel_sales_date,
ABS(sale_date - lag(sale_date,3) over (partition BY cust_num ORDER BY sale_date)) day_delta
FROM table1
)
SELECT pk,
cust_num,
sale_date,
rel_sales_date,
day_delta,
day_rank
FROM (
SELECT pk ,
cust_num,
sale_date,
rel_sales_date,
day_delta,
dense_rank() over (partition BY pk ORDER BY day_delta nulls last) day_rank
FROM foo
)
foob
WHERE day_rank <= 3
ORDER BY cust_num,
sale_date,
day_rank
PK | CUST_NUM | SALE_DATE | REL_SALES_DATE | DAY_DELTA | DAY_RANK
--------+----------+------------+----------------+-----------+----------
7 | 1 | 2014-10-06 | 2014-10-12 | 6 | 1
7 | 1 | 2014-10-06 | 2014-10-14 | 8 | 2
7 | 1 | 2014-10-06 | 2014-10-17 | 11 | 3
2 | 1 | 2014-10-12 | 2014-10-14 | 2 | 1
2 | 1 | 2014-10-12 | 2014-10-17 | 5 | 2
2 | 1 | 2014-10-12 | 2014-10-06 | 6 | 3
5 | 1 | 2014-10-14 | 2014-10-12 | 2 | 1
5 | 1 | 2014-10-14 | 2014-10-17 | 3 | 2
5 | 1 | 2014-10-14 | 2014-10-19 | 5 | 3
1 | 1 | 2014-10-17 | 2014-10-19 | 2 | 1
1 | 1 | 2014-10-17 | 2014-10-14 | 3 | 2
1 | 1 | 2014-10-17 | 2014-10-12 | 5 | 3
1 | 1 | 2014-10-17 | 2014-10-22 | 5 | 3
4 | 1 | 2014-10-19 | 2014-10-17 | 2 | 1
4 | 1 | 2014-10-19 | 2014-10-22 | 3 | 2
4 | 1 | 2014-10-19 | 2014-10-14 | 5 | 3
3 | 1 | 2014-10-22 | 2014-10-25 | 3 | 1
3 | 1 | 2014-10-22 | 2014-10-19 | 3 | 1
3 | 1 | 2014-10-22 | 2014-10-17 | 5 | 2
3 | 1 | 2014-10-22 | 2014-10-14 | 8 | 3
6 | 1 | 2014-10-25 | 2014-10-22 | 3 | 1
6 | 1 | 2014-10-25 | 2014-10-19 | 6 | 2
6 | 1 | 2014-10-25 | 2014-10-17 | 8 | 3
100008 | 5 | 2014-10-07 | 2014-10-13 | 6 | 1
100008 | 5 | 2014-10-07 | 2014-10-15 | 8 | 2
100008 | 5 | 2014-10-07 | 2014-10-18 | 11 | 3
300002 | 5 | 2014-10-13 | 2014-10-15 | 2 | 1
300002 | 5 | 2014-10-13 | 2014-10-18 | 5 | 2
300002 | 5 | 2014-10-13 | 2014-10-07 | 6 | 3
100006 | 5 | 2014-10-15 | 2014-10-13 | 2 | 1
100006 | 5 | 2014-10-15 | 2014-10-18 | 3 | 2
100006 | 5 | 2014-10-15 | 2014-10-20 | 5 | 3
200003 | 5 | 2014-10-18 | 2014-10-20 | 2 | 1
200003 | 5 | 2014-10-18 | 2014-10-15 | 3 | 2
200003 | 5 | 2014-10-18 | 2014-10-13 | 5 | 3
200003 | 5 | 2014-10-18 | 2014-10-23 | 5 | 3
200004 | 5 | 2014-10-20 | 2014-10-18 | 2 | 1
200004 | 5 | 2014-10-20 | 2014-10-23 | 3 | 2
200004 | 5 | 2014-10-20 | 2014-10-15 | 5 | 3
100005 | 5 | 2014-10-23 | 2014-10-20 | 3 | 1
100005 | 5 | 2014-10-23 | 2014-10-26 | 3 | 1
100005 | 5 | 2014-10-23 | 2014-10-18 | 5 | 2
100005 | 5 | 2014-10-23 | 2014-10-15 | 8 | 3
100007 | 5 | 2014-10-26 | 2014-10-23 | 3 | 1
100007 | 5 | 2014-10-26 | 2014-10-20 | 6 | 2
100007 | 5 | 2014-10-26 | 2014-10-18 | 8 | 3
(46 rows)
希望幫助,如果沒有我至少得到了一些腦力鍛鍊這個星期五 下午。