2013-12-18 32 views
0

行我想类似的解决方案为每sql group by only rows which are in sequenceSQL Server 2008中组仅在序列

这是我的数据。

ID SiteID Latitude Longitude 
1 104 -6.197488 106.421873 
2 823 -6.52733 106.849 
3 823 -6.52733 106.849 
4 823 -6.52733 106.849 
5 823 -6.52733 106.849 
6 823 -6.52733 106.849 
7 104 -6.197488 106.421873 
8 841 -6.30754 107.307 

而且我只想以相同的顺序对记录进行分组。结果(ID col并不重要):

ID SiteID Latitude Longitude 
1 104 -6.197488 106.421873 
6 823 -6.52733 106.849 
7 104 -6.197488 106.421873 
8 841 -6.30754 107.307 

尝试跟随,但它没有返回所需的结果。

 ;WITH YourTable AS 
(
    SELECT ID, SiteID, Latitude, Longitude FROM @LatLng 
), 
T AS 
(
SELECT ID, 
     SiteID,Latitude, Longitude, 
     ROW_NUMBER() OVER (ORDER BY ID) - ROW_NUMBER() OVER (PARTITION BY SiteID ORDER BY ID) AS Grp 
FROM YourTable 
) 
SELECT SiteID, Latitude, Longitude FROM T 
GROUP BY SiteID,Latitude, Longitude, Grp 

这是示例代码上述场景中运行:

DECLARE @LatLng TABLE (ID [int] IDENTITY(1,1) NOT NULL,SiteID nVARCHAR(50), Latitude float, Longitude float) 
    INSERT INTO @LatLng(SiteID, Latitude, Longitude) VALUES ('104',1,106) 
    INSERT INTO @LatLng(SiteID, Latitude, Longitude) VALUES ('823',-6,106) 
    INSERT INTO @LatLng(SiteID, Latitude, Longitude) VALUES ('823',-6,106) 
    INSERT INTO @LatLng(SiteID, Latitude, Longitude) VALUES ('823',-6,106) 
INSERT INTO @LatLng(SiteID, Latitude, Longitude) VALUES ('823',-6,106) 
    INSERT INTO @LatLng(SiteID, Latitude, Longitude) VALUES ('104',1,106) 
    INSERT INTO @LatLng(SiteID, Latitude, Longitude) VALUES ('814',-3,106) 

    SELECT * FROM @LatLng 

    ;with cte as(select *, row_number() over (partition by siteid order by id)as grp from @LatLng) select * from cte where grp=1 
+0

从你所示的结果集,它看起来像你只'SiteID'需要将它们分组。可能的解决方案:';用cte作为(select *,row_number()over(由siteid按id划分的分区)作为来自yourtable的grp)select * from cte where grp = 1' –

+0

可以详细说明*“ “*,这没有多大帮助。 – GarethD

+0

我已经在示例代码的上面添加了这个。 –

回答

1
; 
WITH T AS (SELECT ID 
         , SiteID 
         , Latitude 
         , Longitude 
         , DENSE_RANK() OVER (ORDER BY ID) 
         - DENSE_RANK() OVER (PARTITION BY SiteID ORDER BY ID) AS Grp 
       FROM  @LatLng 
      ) 
    SELECT MAX(ID) 
      , SiteID 
      , Latitude 
      , Longitude 
    FROM T 
    GROUP BY SiteID 
      , Latitude 
      , Longitude 
      , Grp 
    ORDER BY MAX(ID) 
+0

谢谢Stuart,我现在需要时间来消化它。 :) –

0
;WITH T AS 
(
    SELECT ID, SiteID,Latitude, Longitude, 
      ROW_NUMBER() OVER (PARTITION BY SiteID ORDER BY ID ASC) AS Grp 
    FROM @LatLng 
) 
SELECT SiteID, Latitude, Longitude 
FROM T 
WHERE Grp = 1 
+0

这与他们已有的有何不同? (在“这是示例代码运行以上方案”后面的代码末尾) –

+0

@MartinSmith - 它不是,由于某种原因,OP在我发布这个之后补充说。我完全不清楚他想要什么,但我想斯图尔特知道了。 – Hogan

+0

OP要求的组是基于id的顺序。忽略具有相同'SiteId'的连续字符,SiteIds的模式是'104,823,104,841',注意'104'出现两次。 –