Агрегат SQL Server rand()
-
21-08-2019 - |
Вопрос
Проблема: таблица координат 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 .