我想要一个类似于sql group by only rows which are in sequence
的解决方案这是我的数据。
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 :(得分: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)
答案 1 :(得分: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