Frage

Problem: eine Tabelle von lat / lngs zu 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 distinct nicht verwendbar ist, weil ich brauche die id-Spalte zurückzukehren, die ist per Definition eindeutig. Diese Art von Arbeiten (@maxcount die Anzahl der Zeilen, die wir benötigen, intid ist 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 Rückkehr leider gegeben koordinieren, was etwas schade für meinen Gebrauch ist. Wenn wir nur ein rand() Aggregat hatten, konnten wir statt max() verwenden ... Beachten Sie, dass Sie nicht max() mit guids erstellt von newid() verwenden können.

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

War es hilfreich?

Lösung

könnten Sie in der Lage sein, einen CTE für diesen mit der ROW_NUMBER Funktion über lat und lange zu verwenden und dann rand () verwendet dagegen. So 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)

Das wird immer die ersten Sätze von lat zurückkehren 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 habe, später werde ich versuchen, um dieses letzte Hindernis zu erhalten.

Andere Tipps

das für Sie funktioniert nicht?

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top