SQL Server rand () Aggregat

stimmen
1

Problem: eine Tabelle von lat / lngs koordinieren. Zwei Reihen können möglicherweise die gleiche koordinieren. Wir wollen eine Abfrage , die eine Reihe von Zeilen mit einzigartigen Koordinaten (innerhalb des zurückgegebenen Satz) zurückgibt. Beachten Sie, dass distinctnicht verwendbar ist , weil ich brauche die id - Spalte zurückzukehren , die ist per Definition eindeutig. Diese Art von Arbeiten ( @maxcountdie Anzahl der Zeilen , die wir benötigen, intidist eine einzigartige int id Spalte):

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

Es wird immer die gleiche Zeile für eine gegebene Rück leider koordinieren, was etwas schade für meinen Gebrauch ist. Wenn wir nur einen haben rand()Aggregat wir statt verwenden könnten max()... Beachten Sie, dass Sie nicht verwenden können max()mit guids erstellt von newid().

Irgendwelche Ideen? (es gibt einige mehr Hintergrund hier, wenn Sie interessiert sind : http://www.itu.dk/~friism/blog/?p=121 )

UPDATE: Voll Lösung hier

Veröffentlicht am 10/12/2008 um 01:22
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
2

Sie könnten in der Lage, einen CTE für diesen mit der ROW_NUMBER Funktion über lat und lange zu verwenden und dann rand () verwendet dagegen. Etwas wie:

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)

Dies wird immer wieder zurückkehren, die ersten Sätze von lat und lngs und ich habe nicht in der Lage gewesen, die Reihenfolge zufällig zu machen. Vielleicht mit diesem Ansatz auch weiterhin auf jemanden kann. Es wird Ihnen eine zufällige Zeile innerhalb der passenden lat und lng Kombinationen though.

Wenn ich mehr Zeit haben, später werde ich versuchen, um dieses letzte Hindernis zu bekommen.

Beantwortet am 10/12/2008 um 03:42
quelle vom benutzer

stimmen
1

Dies gilt nicht für Sie arbeiten?

select top (@maxcount) *
from 
(
    select max(intid) as id from Documents d group by d.geoLng, d.geoLat
) t 
order by newid()
Beantwortet am 10/12/2008 um 12:29
quelle vom benutzer

stimmen
0

Wo haben Sie die Idee, dass DISTINCT nur auf einer Säule funktioniert? Wie auch immer, Sie können auch eine GROUP BY-Klausel verwenden.

Beantwortet am 10/12/2008 um 01:30
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more