具体见下:
表中内容
名称 地点 日期
--------------------------------------
bbb 江苏 2016-06-01 16:30:28
aaa 河南 2016-06-01 16:29:01
bbb 河北 2016-05-30 06:35:24
aaa 江苏 2016-05-30 10:39:28
aaa 河北 2016-04-27 11:33:49
查询【2016-05-30】到【2016-06-01】期间的所有对应名称的地点、日期、上次地点、上次日期
希望的结果如下所示:
名称 地点 日期 上次地点 上次日期
-------------------------------------------------------------------
aaa 河南 2016-06-01 16:29:01 江苏 2016-05-30 10:39:28
aaa 江苏 2016-05-30 10:39:28 河北 2016-04-27 11:33:49
bbb 江苏 2016-06-01 16:30:28 河北 2016-05-30 06:35:24
bbb 河北 2016-05-30 06:35:24
------------------------------------------------------------------------------------
DECLARE @bt DATETIME='2016-05-30';
DECLARE @et DATETIME='2016-06-01';
SET @et=DATEADD(d,1,@et);
;WITH testSource(名称,地点,日期) AS (
SELECT 'bbb','江苏','2016-06-01 16:30:28' union all
SELECT 'aaa','河南','2016-06-01 16:29:01' union all
SELECT 'bbb','河北','2016-05-30 06:35:24' union all
SELECT 'aaa','江苏','2016-05-30 10:39:28' union all
SELECT 'aaa','河北','2016-04-27 11:33:49'
)
,t AS (
SELECT *,rn=ROW_NUMBER()OVER(PARTITION BY 名称 ORDER BY 日期 desc)
FROM testSource
)
SELECT t1.地点,t1.日期,t2.地点 上次地点,t2.日期 上次日期
FROM t t1
LEFT JOIN t t2 ON t1.名称=t2.名称 AND t1.rn=t2.rn-1
WHERE t1.日期>=@bt AND t1.日期<@et
ORDER BY t1.名称,t1.rn