1.Table Name:Diary
ID Name City Food RecDate
1 TOM Newyork APPLE 2006/10/1
2 JERRY Tokyo BANANA 2006/10/4
3 JERRY London GRAPE 2006/10/6
4 TOM Newyork GRAPE 2006/10/5
5 TOM Paris BANANA 2006/10/11
6 TOM Paris BEEF 2006/10/17
7 JERRY London BEEF 2006/10/17
8 TOM Newyork PORK 2006/10/21
9 TOM Newyork GRAPE 2006/10/22
10 JERRY Tokyo PORK 2006/10/19
11 JERRY London GRAPE 2006/10/20
12 TOM Newyork BANANA 2006/10/23
13 JERRY London BEEF 2006/10/25Description: 这是一个公共日记的Table,很多用户都会往里面增加自己的日记记录。每当旅行到一个新的城市或者吃到了印象深刻的食物的当天,用户都会记录下来。2.Expected Result
SeqName Name City Food StayingDays
1 TOM Newyork APPLE 0
2 TOM Newyork GRAPE 4
3 TOM Paris BANANA 0
4 TOM Paris BEEF 6
5 TOM Newyork PORK 0
6 TOM Newyork GRAPE 1
7 TOM Newyork BANANA 2
1 JERRY Tokyo BANANA 0
2 JERRY London GRAPE 0
3 JERRY London BEEF 11
4 JERRY Tokyo PORK 0
5 JERRY London GRAPE 0
6 JERRY London BEEF 5Description: 这是一个Query的Result Set,这里的每一条记录代表每一条日记,但是有两个column需要用query来获得。
1)SeqName: 个人单位的日记记录序列
2)StayingDays: 写该条日记时在该城市所逗留的日数我已经有了一种做法,现在抛砖引玉列在下面,接着寻求不同的做法,如果有不使用analytic function的做法的话那就更好了:
SELECT 
ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ID) AS SEQ,
NAME,
CITY,
RECDATE,
ROUND(RECDATE - DECODE(T1.ARRIVALDATE,NULL,
(SELECT MAX(T2.ARRIVALDATE) FROM 
(SELECT 
ID, 
NAME, 
CASE WHEN
CITY != LAG(CITY) OVER (PARTITION BY NAME ORDER BY ID)
OR LAG(CITY) OVER (PARTITION BY NAME ORDER BY ID) IS NULL THEN
RECDATE
ELSE
NULL
END AS ARRIVALDATE
FROM DIARY) T2
WHERE T2.ID < T1.ID AND T2.NAME = T1.NAME) ,
T1.ARRIVALDATE)) AS STAYINGDAYS
FROM 
(SELECT 
ID, 
NAME, 
CITY,
RECDATE,
CASE WHEN
CITY != LAG(CITY) OVER (PARTITION BY NAME ORDER BY ID)
OR LAG(CITY) OVER (PARTITION BY NAME ORDER BY ID) IS NULL THEN
RECDATE
ELSE
NULL
END AS ARRIVALDATE
FROM DIARY) T1
ORDER BY NAME DESC