Вопрос

Проблема: таблица координат lat /lngs.Две строки потенциально могут иметь одну и ту же координату.Нам нужен запрос, который возвращает набор строк с уникальными координатами (в пределах возвращаемого набора).Обратите внимание , что distinct не может быть использован, потому что мне нужно вернуть столбец id, который, по определению, отличается.Такого рода работы (@maxcount это количество строк, которые нам нужны, intid является уникальным столбцом int id):

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

К сожалению, он всегда будет возвращать одну и ту же строку для заданной координаты, что немного досадно для моего использования.Если бы только у нас был rand() агрегат, который мы могли бы использовать вместо max()...Обратите внимание, что вы не можете использовать max() с идентификаторами guid, созданными newid().

Есть какие-нибудь идеи?(здесь есть еще кое-какая справочная информация, если вам интересно: http://www.itu.dk /~фриизм/блог/?страница=121)

Обновить:Полное решение здесь

Это было полезно?

Решение

Возможно, вы смогли бы использовать CTE для этого с функцией ROW_NUMBER через lat и long, а затем использовать 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 и lngs, и я не смог сделать заказ случайным.Может быть, кто-то сможет продолжить использовать этот подход.Однако это даст вам случайную строку в соответствующих комбинациях lat и lng.

Если позже у меня будет больше времени, я попытаюсь обойти это последнее препятствие.

Другие советы

у тебя это не работает?

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

Откуда вы взяли идею, что DISTINCT работает только с одним столбцом?В любом случае, вы также могли бы использовать предложение GROUP BY .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top