【发布时间】:2015-10-26 08:07:46
【问题描述】:
我使用的是 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
我要做的是让这些数据按 Day 排序,然后是 ManualOrder ......但我想要一个行计数器(我们称之为 MapPinNumber)。问题是我希望这个行计数器在同一天再次遇到相同的纬度/经度时重复。然后,如果它是不同的纬度/经度,它可以继续使用下一行的下一行计数器。我们必须在最终结果中维护 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
【问题讨论】:
-
您应该使用
RANK()或DENSE_RANK()(视情况而定)而不是ROW_NUMBER()。 -
我已经尝试过了,但似乎无法得到正确的结果。
-
我无法理解您的要求,能否请您具体说明一下您目前的结果和预期结果?
-
你上面显示的 MapPinNumber 是你想要的结果吗?
-
是的。我正在尝试根据其他列计算该列。最终结果必须按 Day ASC、ManualOrder ASC 排序。
标签: sql sql-server sql-server-2008 row-number dense-rank