And*_*ndy 9 sql sql-server row-number sql-server-2008 dense-rank
我正在使用SQL Server 2008.我在查询中返回了这些数据,看起来非常类似于Day和ManualOrder所订购的...
ID Day ManualOrder Lat Lon
1 Mon 0 36.55 36.55
5 Mon 1 55.55 54.44
3 Mon 2 44.33 44.30
10 Mon 3 36.55 36.55
11 Mon 4 36.55 36.55
6 Mon 5 20.22 22.11
9 Mon 6 55.55 54.44
10 Mon 7 88.99 11.22
77 Sun 0 23.33 11.11
77 Sun 1 23.33 11.11
Run Code Online (Sandbox Code Playgroud)
我想要做的是按天订购这些数据,然后是ManualOrder ...但我想要一个行计数器(我们称之为MapPinNumber).问题是我希望这个行计数器在同一天遇到相同的Lat/Lon时再次重复.然后,如果它是不同的纬度/经度,它可以继续下一行的下一行计数器.我们必须在最终结果中维护Day,ManualOrder.
我将在地图上绘制这些数字,这个数字应代表我将以ManualOrder顺序绘制的引脚编号.该数据代表驾驶员的路线,并且他可以在他的日程表中白天多次去同一个纬度/经度.例如,他开车去沃尔玛,然后是CVS,然后又回到沃尔玛,然后再去沃尔格林.我需要的MapPinNumber列应该是1,2,1,3.由于他周一多次去沃尔玛,但这也是他开车的第一个地方,它总是在地图上的Pin#1.
这就是我需要的结果,我需要计算的MapPinNumber列.我已经尝试过ROW_NUMBER和RANK所能想到的一切,并且疯了!我试图避免使用丑陋的CURSOR.
ID Day ManualOrder Lat Lon MapPinNumber
1 Mon 0 36.55 36.55 1
5 Mon 1 55.55 54.44 2
3 Mon 2 44.33 44.30 3
10 Mon 3 36.55 36.55 1
11 Mon 4 36.55 36.55 1
6 Mon 5 20.22 22.11 4
9 Mon 6 55.55 54.44 2
10 Mon 7 88.99 11.22 5
77 Sun 0 23.33 11.11 1
77 Sun 1 23.33 11.11 1
Run Code Online (Sandbox Code Playgroud)
您可以使用聚合函数MIN来OVER创建排名组并DENSE_RANK在其之上像这样进行操作。
简要说明
MIN(ManualOrder)OVER(PARTITION BY Day,Lat,Lon)获取、和ManualOrder 的组合的最小值。DayLatLon
DENSE_RANK()只需将此值设置为 的增量值1。
样本数据
CREATE TABLE Tbl ([ID] int, [Day] varchar(3), [ManualOrder] int, [Lat] int, [Lon] int);
INSERT INTO Tbl ([ID], [Day], [ManualOrder], [Lat], [Lon])
VALUES
(1, 'Mon', 0, 36.55, 36.55),
(5, 'Mon', 1, 55.55, 54.44),
(3, 'Mon', 2, 44.33, 44.30),
(10, 'Mon', 3, 36.55, 36.55),
(11, 'Mon', 4, 36.55, 36.55),
(6, 'Mon', 5, 20.22, 22.11),
(9, 'Mon', 6, 55.55, 54.44),
(10, 'Mon', 7, 88.99, 11.22),
(77, 'Sun', 0, 23.33, 11.11),
(77, 'Sun', 1, 23.33, 11.11);
Run Code Online (Sandbox Code Playgroud)
询问
;WITH CTE AS
(
SELECT *,GRP = MIN(ManualOrder)OVER(PARTITION BY Day,Lat,Lon) FROM Tbl
)
SELECT ID,Day,ManualOrder,Lat,Lon,DENSE_RANK()OVER(PARTITION BY Day ORDER BY GRP) AS RN
FROM CTE
ORDER BY Day,ManualOrder
Run Code Online (Sandbox Code Playgroud)
输出
ID Day ManualOrder Lat Lon RN
1 Mon 0 36.55 36.55 1
5 Mon 1 55.55 54.44 2
3 Mon 2 44.33 44.30 3
10 Mon 3 36.55 36.55 1
11 Mon 4 36.55 36.55 1
6 Mon 5 20.22 22.11 4
9 Mon 6 55.55 54.44 2
10 Mon 7 88.99 11.22 5
77 Sun 0 23.33 11.11 1
77 Sun 1 23.33 11.11 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4374 次 |
| 最近记录: |