質問
の問題:座標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句を使用することができます。