SQL Server rand () التجميعية
-
21-08-2019 - |
سؤال
مشكلة: جدول إحداثيات خطوط العرض/الخطوط الطولية.من المحتمل أن يكون لصفين نفس الإحداثيات.نريد استعلامًا يُرجع مجموعة من الصفوف بإحداثيات فريدة (ضمن المجموعة التي تم إرجاعها).لاحظ أن distinct
غير قابل للاستخدام لأنني بحاجة إلى إرجاع عمود المعرف الذي يعتبر مميزًا بحكم التعريف.هذا النوع من الأعمال (@maxcount
هو عدد الصفوف التي نحتاجها، intid
هو عمود معرف int فريد):
select top (@maxcount) max(intid)
from Documents d
group by d.geoLng, d.geoLat
سيعود دائمًا نفس الصف لإحداثيات معينة لسوء الحظ، وهو أمر مؤسف بعض الشيء بالنسبة لاستخدامي.لو كان لدينا فقط rand()
الكلي الذي يمكننا استخدامه بدلا من max()
...لاحظ أنه لا يمكنك استخدام max()
مع الأدلة التي تم إنشاؤها بواسطة newid()
.
أيه أفكار؟(هناك المزيد من المعلومات الأساسية هنا، إذا كنت مهتمًا: http://www.itu.dk/~friism/blog/?p=121)
تحديث:الحل الكامل هنا
المحلول
قد تتمكن من استخدام CTE لهذا مع الدالة ROW_NUMBER عبر خطوط الطول والعرض ثم استخدام 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)
سيؤدي هذا دائمًا إلى إرجاع المجموعات الأولى من خطوط الطول والعرض ولم أتمكن من إجراء الطلب عشوائيًا.ربما يمكن لشخص ما الاستمرار في هذا النهج.سيعطيك صفًا عشوائيًا ضمن مجموعات خطوط الطول وخطوط الطول المتطابقة.
إذا كان لدي المزيد من الوقت لاحقًا سأحاول التغلب على تلك العقبة الأخيرة.
نصائح أخرى
هذا لا يعمل بالنسبة لك؟
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.