سؤال

مشكلة: جدول إحداثيات خطوط العرض/الخطوط الطولية.من المحتمل أن يكون لصفين نفس الإحداثيات.نريد استعلامًا يُرجع مجموعة من الصفوف بإحداثيات فريدة (ضمن المجموعة التي تم إرجاعها).لاحظ أن 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top