質問

問題:座標LAT / lngsのテーブルする。 2つの行が潜在的に同じ座標を持つことができます。我々は独自の座標(返されたセットの中)で一連の行を返すクエリをしたいです。私は異なる、定義により、あるid列を返す必要があるためdistinctが使用可能でないことに留意されたいです。作品のこの種(@maxcountは、私たちが必要とする行数で、intidはユニークなint型のID列である):

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

これは、常に所定の私の使用のための恥のビットであり、残念ながら座標に同じ行を返します。我々はrand()集合体を持っていた場合にのみ、我々はあなたがmax()によって作成されたのGUIDとmax()を使用することはできません...代わりにnewid()を使用することができます。

任意のアイデア? (いくつかのより多くの背景がここにあります、もし興味があるなら:のhttp:// WWW .itu.dk /〜friism /ブログ/?p = 121 の)

UPDATE:フルソリューションここ

役に立ちましたか?

解決

あなたは、緯度と長い間でROW_NUMBER関数で、このためにCTEを使用し、その反対ランド()を使用することができるかもしれません。ような何かます:

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)

これは、常に緯度とlngsの最初のセットを返しますし、私は順序はランダムにすることができませんでした。たぶん、誰かがこのアプローチを続けることができます。これは、しかし、マッチング緯度とLNGの組み合わせの中にあなたにランダムな行を提供します。

私はより多くの時間を持っている場合は、

後、私はその最後の障害物を回避しようとするでしょう。

他のヒント

これはあなたのために動作しないのですか?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()

どこでDISTINCTが1列のみで動作することをアイデアを得るのですか?とにかく、あなたはまた、GROUP BY句を使用することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top