2014-04-08 56 views
3

我有以下GPS报告表:SQL分区按多列

Original Table

我的纬度,经度期待组和检索资源运动的顺序:

Expected Result

我几乎在那里用以下代码:

;WITH dt AS(
    SELECT ROW_NUMBER() OVER (Partition By ROUND(Latitude,2), ROUND(Longitude, 2),   DATEPART(hh,[GPS Time]) ORDER BY [GPS Time]) AS RowNumber, 
ID, ResourceID, Region, [GPS Time], ROUND(Latitude,2) AS Latitude, ROUND(Longitude, 2) AS Longitude 
FROM [dbo].[GeofenceReport] WHERE TenantID=2 AND CAST([GPS Time] AS Date) = '2014-02-11' AND ResourceID = 'MH202 (B 9349 OI)' 
) 
    SELECT * FROM dt WHERE RowNumber = 1 ORDER BY [GPS Time] 

但是,这将分组资源的所有发生。我希望它按顺序分组。所以,如果资源离开地点A - 移动到地点B - 然后地点C,然后再次地点A.

Example in SQL Fiddle

回答

3

我不认为你可以使用一个简单的排名功能做到这一点。按时间排序并不会给您希望的经纬度/纬度组ID,并且按地理位置排序没有多大意义。什么会工作是创建一个标志,说明如果纬度/经度改变,并使用运行总和作为序列/组ID。然后你可以通过分组得到你的结果。

with cte as 
(
    SELECT 
    ID, ResourceID, Region, [GPS Time], Latitude, Longitude, 
    lag(LATITUDE, 1) over(order by [gps time]) as prev_LATITUDE, 
    lag(LONGITUDE, 1) over(order by [gps time]) as prev_LONGITUDE 
    FROM 
    [dbo].[GeofenceReport] 
) 
, cte2 as 
(
    select 
    ID, ResourceID, Region, [GPS Time], Latitude, Longitude, 
    SUM(
     -- 1 if location changed, 0 otherwise 
     CASE WHEN 
     Latitude <> prev_Latitude 
     OR Longitude <> prev_Longitude THEN 1 
     ELSE 0 END 
    ) OVER(ORDER BY [GPS Time]) as seq -- running sum over time 
    from cte 
) 
select 
    min(id) as id, min(region) as region, min([GPS Time]) as [GPS Time], 
    min(Latitude) as Latitude, min(Longitude) as Longitude 
from cte2 
group by seq 

你更新SQL fiddle