سؤال

ولدي جدول القيم مثل هذا

978412, 400
978813, 20
978834, 50
981001, 20

وكما ترون الرقم الثاني عندما تضاف إلى الأول هو 1 العدد قبل اليوم التالي في تسلسل. العدد الأخير ليست في نطاق (] لا تتبع التسلسل المباشر، كما هو الحال في القيمة التالية). ما تحتاجه هو CTE (نعم، من الناحية المثالية) أن الإرادة الانتاج هذا

978412, 472
981001, 20

والصف الأول يحتوي على عدد بداية نطاق ثم مجموع العقد الداخل. الصف التالي هو مدى القادم والذي في هذا المثال هو نفس البيانات الأصلية.

هل كانت مفيدة؟

المحلول

ومن المادة التي نشرت جوش، وهنا بلدي يأخذ (اختبار والعمل):

SELECT
    MAX(t1.gapID) as gapID,
    t2.gapID-MAX(t1.gapID)+t2.gapSize as gapSize
    -- max(t1) is the specific lower bound of t2 because of the group by.
FROM
  ( -- t1 is the lower boundary of an island.
    SELECT gapID
    FROM gaps tbl1 
    WHERE
      NOT EXISTS(
        SELECT *
        FROM gaps tbl2 
        WHERE tbl1.gapID = tbl2.gapID + tbl2.gapSize + 1
      )
  ) t1
  INNER JOIN ( -- t2 is the upper boundary of an island.
    SELECT gapID, gapSize
    FROM gaps tbl1 
    WHERE
      NOT EXISTS(
        SELECT * FROM gaps tbl2 
        WHERE tbl2.gapID = tbl1.gapID + tbl1.gapSize + 1
      )
  ) t2 ON t1.gapID <= t2.gapID -- For all t1, we get all bigger t2 and opposite.
GROUP BY t2.gapID, t2.gapSize

نصائح أخرى

وتحقق من هذا MSDN المادة . فهو يوفر لك الحل لمشكلتك، اذا كانت ستعمل لك يعتمد على ammount من البيانات لديك ومتطلبات الأداء الخاص بك للاستعلام.

تحرير:

وكذلك باستخدام المثال في الاستعلام، والذهاب مع نظيره الحل الأخير والطريقة الثانية للحصول على الجزر (أدت الطريقة الأولى في خطأ على SQL 2005).

SELECT MIN(start) AS  startGroup, endGroup, (endgroup-min(start) +1) as NumNodes
FROM (SELECT g1.gapID AS start,
(SELECT min(g2.gapID) FROM #gaps g2 
WHERE g2.gapID >= g1.gapID and NOT EXISTS
(SELECT * FROM #gaps g3 
WHERE g3.gapID - g2.gapID = 1)) as endGroup
FROM #gaps g1) T1 GROUP BY endGroup

والشيء أضفت هو (endgroup-min(start) +1) as NumNodes. هذا وسوف تعطيك التهم.

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