1

問題:座標lat/lngsのテーブル。2つの行が同じ座標を持つ可能性があります。(返されたセット内の)一意の座標を持つ行のセットを返すクエリが必要です。distinct定義上、異なるid列を返す必要があるため、これは使用できないことに注意してください。この種の作業(@maxcount必要な行数intid、一意のint id列):

select top (@maxcount) max(intid)
from Documents d
group by d.geoLng, d.geoLat

残念ながら、指定された座標に対して常に同じ行が返されます。これは、私の使用には少し残念です。rand()代わりに使用できる集計がある場合のみ...によって作成されたGUIDmax()では使用できないことに注意してください。max()newid()

何か案は?(興味がある場合は、ここにもう少し背景があります:http ://www.itu.dk/~friism/blog/?p=121 )

更新:ここで完全なソリューション

4

3 に答える 3

2

これには、緯度と経度でROW_NUMBER関数を使用してCTEを使用し、それに対してrand()を使用できる場合があります。何かのようなもの:

WITH cte AS
(
    SELECT
        intID,
        ROW_NUMBER() OVER
            (
                PARTITION BY geoLat, geoLng
                ORDER BY NEWID()
            ) AS row_num,
        COUNT(intID) OVER (PARTITION BY geoLat, geoLng) AS TotalCount
    FROM
        dbo.Documents
)
SELECT TOP (@maxcount)
    intID, RAND(intID)
FROM
    cte
WHERE
    row_num = 1 + FLOOR(RAND() * TotalCount)

これにより、常にlatとlngの最初のセットが返され、順序をランダムにすることができませんでした。多分誰かがこのアプローチを続けることができます。ただし、一致するlatとlngの組み合わせ内でランダムな行が表示されます。

後でもっと時間があれば、最後の障害を回避しようとします。

于 2008-12-10T02:42:54.460 に答える
1

これはうまくいきませんか?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()
于 2008-12-10T11:29:50.530 に答える
0

DISTINCTは1つの列でのみ機能するという考えをどこで得ましたか?とにかく、GROUPBY句を使用することもできます。

于 2008-12-10T00:30:41.327 に答える