10

私は 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  

私がやろうとしているのは、このデータを日、次に ManualOrder で並べ替えることです...しかし、行カウンターが必要です (これを MapPinNumber と呼びましょう)。問題は、同じ日の同じ緯度/経度に再び遭遇したら、この行カウンターを繰り返したいということです。次に、緯度/経度が異なる場合は、次の行の次の行カウンターで続行できます。最終結果で Day、ManualOrder の順序を維持する必要があります。

これらをマップ上にプロットします。この番号は、ManualOrder の順序でプロットするピン番号を表す必要があります。このデータはドライバーのルートを表し、ドライバーはスケジュールで 1 日に同じ緯度/経度に複数回行く可能性があります。たとえば、彼は車で Walmart に行き、次に CVS に行き、次に再び Walmart に戻り、次に Walgreens に行きます。必要な MapPinNumber 列は 1、2、1、3 である必要があります。彼は月曜日に複数回ウォルマートに行きますが、彼が運転する最初の場所でもあったため、常にマップのピン #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
4

4 に答える 4

4

これが私の試みROW_NUMBERです:

SQL フィドル

WITH CteRN AS(
    SELECT *,
        Rn = ROW_NUMBER() OVER(PARTITION BY Day ORDER BY ManualOrder),
        Grp = ROW_NUMBER() OVER(PARTITION BY Day, Lat, Lon ORDER BY ManualOrder)
    FROM tbl
),
CteBase AS(
    SELECT *,
        N = ROW_NUMBER() OVER(PARTITION BY Day ORDER BY ManualOrder)
    FROM CteRN
    WHERE Grp = 1
)
SELECT 
    r.ID, r.Day, r.ManualOrder, r.Lat, r.Lon,
    MapPinNumber = ISNULL(b.N, r.RN)
FROM CteRN r
LEFT JOIN CteBase b
    ON b.Day = r.Day
    AND b.Lat = r.Lat
    AND b.Lon = r.Lon
ORDER BY 
    r.Day, r.ManualOrder
于 2015-08-04T04:47:26.403 に答える
0

これにより、必要な結果が得られます。ただし、MapPinNumber結果に示されている順序とまったく同じではない場合があります。

SELECT *, 
    MapPinNumber = DENSE_RANK() OVER (PARTITION BY Day ORDER BY Lat, Lon) 
FROM Table1
ORDER BY Day, ManualOrder
于 2015-08-04T06:26:29.907 に答える