SQL - 按日期

时间:2016-04-27 08:06:24

标签: sql sql-server

我正在尝试获取显示位置和日期更改的记录列表,以显示显示上一个位置的每个记录的一行。 基本上是一个查询来获取如下数据:

enter image description here

并显示如下:

enter image description here

我尝试使用lag,但它混合了一些记录。有人能建议一个好方法吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

你可以尝试一下:

SELECT a.id,a.name,a.location as currentLocation,a.locationdatedate as currrentLocate,b.location as preLocation,b.locationdatedate as prevLocate,a.changereason 
FROM test as a
JOIN test as b ON a.name = b.name 
where a.locationdatedate > b.locationdatedate
group by a.name

答案 1 :(得分:0)

DECLARE @TABLE TABLE
(ID INT ,NAME VARCHAR(20), LOCATIONDATE DATETIME, REASON VARCHAR(20))
INSERT INTO @TABLE 
(ID,NAME, LOCATIONDATE, REASON)
VALUES
( 1,'abc',CAST('2016/01/01' AS SMALLDATETIME),'move'),
( 2,'def',CAST('2016/02/01' AS SMALLDATETIME),'move'),
( 1,'abc',CAST('2016/06/01' AS SMALLDATETIME),'move'),
( 2,'def',CAST('2016/07/01' AS SMALLDATETIME),'move'),
( 1,'abc',CAST('2016/08/01' AS SMALLDATETIME),'move'),
( 3,'ghi',CAST('2016/08/01' AS SMALLDATETIME),'move')

select  s.*
        ,t1.*
from
(
select  t.*,
        row_number() over (partition by id order by  locationdate desc) rn
from    @table t
) s
left join
(
select  t.*,
        row_number() over (partition by id order by  locationdate desc) rn
from    @table t
) t1
on t1.id = s.id and t1.rn = s.rn + 1

答案 2 :(得分:0)

请试试这个。它在这里工作

SELECT l.id,
    ,l.name
    ,l.location as currentLocation
    ,l.locationdatedate as currrentLocate
    ,r.location as preLocation
    ,r.locationdatedate as prevLocate
    ,r.changereason 
FROM tableName AS l inner join 
tableName AS r ON r.id=l.id 
WHERE l.locationdatedate !=r.locationdatedate AND l.locationdatedate >   r.locationdatedate