날짜의 차이에 대한 전방 또는 후진 측정 만 원한다면 간단한 지연/납치 방식으로이 작업을 수행 할 수 있다고 생각합니다. 그런 다음
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로 지정할 가능성이 경우
SELECT UNIQUE_PRIMARY_KEY pk,
CUST_NUM,
SALE_DATE,
lead(sale_date,1) over (partition BY cust_num ORDER BY sale_date) lead1,
lead(sale_date,2) over (partition BY cust_num ORDER BY sale_date) lead2,
lead(sale_date,3) over (partition BY cust_num ORDER BY sale_date) lead3
FROM table1
ORDER BY CUST_NUM,
SALE_DATE
PK | CUST_NUM | SALE_DATE | LEAD1 | LEAD2 | LEAD3
--------+----------+------------+------------+------------+------------
7 | 1 | 2014-10-06 | 2014-10-12 | 2014-10-14 | 2014-10-17
2 | 1 | 2014-10-12 | 2014-10-14 | 2014-10-17 | 2014-10-19
5 | 1 | 2014-10-14 | 2014-10-17 | 2014-10-19 | 2014-10-22
1 | 1 | 2014-10-17 | 2014-10-19 | 2014-10-22 | 2014-10-25
4 | 1 | 2014-10-19 | 2014-10-22 | 2014-10-25 |
3 | 1 | 2014-10-22 | 2014-10-25 | |
6 | 1 | 2014-10-25 | | |
100008 | 5 | 2014-10-07 | 2014-10-13 | 2014-10-15 | 2014-10-18
300002 | 5 | 2014-10-13 | 2014-10-15 | 2014-10-18 | 2014-10-20
100006 | 5 | 2014-10-15 | 2014-10-18 | 2014-10-20 | 2014-10-23
200003 | 5 | 2014-10-18 | 2014-10-20 | 2014-10-23 | 2014-10-26
200004 | 5 | 2014-10-20 | 2014-10-23 | 2014-10-26 |
100005 | 5 | 2014-10-23 | 2014-10-26 | |
100007 | 5 | 2014-10-26 | | |
(14 rows)
, 내 머리는 여전히 지연 & 리드를 사용하고 싶어하지만, 이에 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)
희망하는 데 도움이, 그렇지 않은 경우 나는 적어도 이번 금요일 약간 정신 운동을 얻었다 오후.