سؤال

لدي جدول الأوامر التي تحافظ على كل أمر من كل محلاتنا.كتبت استعلام إلى التحقق من تسلسل أوامر لكل مخزن.يبدو مثل هذا.

select WebStoreID, min(webordernumber), max(webordernumber), count(webordernumber) 
from orders
where ordertype = 'WEB' 
group by WebStoreID

ويمكنك التحقق من ذلك كل الأوامر موجودة مع هذا الاستعلام.ويب ordernumber هو رقم من 1...ن.

كيف يمكنني كتابة الاستعلام للعثور على المفقودين أوامر دون الانضمام إلى مؤقت/مختلفة الطاولة ؟

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

المحلول

هل يمكن أن تنضم إلى الجدول على نفسها للكشف عن الصفوف التي ليس لها الصف السابق:

select cur.*
from orders cur
left join orders prev 
    on cur.webordernumber = prev.webordernumber + 1
    and cur.webstoreid = prev.webstoreid
where cur.webordernumber <> 1
and prev.webordernumer is null

وهذا من شأنه أن كشف الثغرات في 1 ... ن تسلسل، لكنه لن يكشف التكرارات.

نصائح أخرى

وأود أن جعل جدول مساعدة من "جميع الأعداد الصحيحة من 1 إلى n" (انظر <لأ href = "http://www.sql-server-helper.com/functions/integer-table.aspx" يختلط = " noreferrer نوفولو "> http://www.sql-server-helper.com/functions/integer-table.aspx للحصول على بعض الطرق لجعله مع وظيفة SQL Server ولكن نظرا لأنه شيء سوف تحتاج أكثر من و فما استقاموا لكم فاستقيموا على جعله الجدول الحقيقي على أي حال، ومع أي محرك SQL فإنه من السهل لجعل هذا، مرة واحدة فقط) ثم استخدام استعلام متداخلة، SELECT value FROM integers WHERE value NOT IN (SELECT webordernumber FROM orders) وج. انظر أيضا http://www.sqlmag.com/Article/ArticleID/99797/ sql_server_99797.html للحصول على مشكلة مماثلة ليدكم، "الكشف عن الثغرات في سلسلة من الأرقام".

إذا كان لديك وظيفة برتبة ()، ولكن ليس من وظيفة تأخر () (وبعبارة أخرى، SQL الخادم)، يمكنك استخدام هذا (الذي اقترحه <لأ href = "http://www.sqlmonster.com/Uwe /Forum.aspx/sql-server-programming/10594/Return-gaps-in-a-sequence "يختلط =" نوفولو "> http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-programming / 10594 / عودة-ثغرات في واحد في تسلسل ):

create table test_gaps_in_sequence (x int)
insert into test_gaps_in_sequence values ( 1 )
insert into test_gaps_in_sequence values ( 2 )
insert into test_gaps_in_sequence values ( 4 )
insert into test_gaps_in_sequence values ( 5 )
insert into test_gaps_in_sequence values ( 8 )
insert into test_gaps_in_sequence values ( 9 )
insert into test_gaps_in_sequence values ( 12)
insert into test_gaps_in_sequence values ( 13)
insert into test_gaps_in_sequence values ( 14)
insert into test_gaps_in_sequence values ( 29)

...

 select lower_bound
         , upper_bound
      from (select upper_bound
                 , rank () over (order by upper_bound) - 1 as upper_rank
              from (SELECT x+n as upper_bound
                      from test_gaps_in_sequence
                         , (SELECT 0 n
                            UNION
                            SELECT -1
                           ) T
                     GROUP BY x+n
                    HAVING MAX(n) = -1
                    ) upper_1
            ) upper_2
         , (select lower_bound
                 , rank () over (order by lower_bound) as lower_rank
              from (SELECT x+n as lower_bound
                      from test_gaps_in_sequence
                         , (SELECT 0 n
                            UNION
                            SELECT 1
                           ) T
                     GROUP BY x+n
                    HAVING MIN(n) = 1
                    ) lower_1
            ) lower_2
      where upper_2.upper_rank = lower_2.lower_rank
      order by lower_bound

... أو، لتشمل "الحدود الخارجية":

select lower_bound
     , upper_bound
  from (select upper_bound
             , rank () over (order by upper_bound) - 1 as upper_rank
          from (SELECT x+n as upper_bound
                  from test_gaps_in_sequence
                     , (SELECT 0 n
                        UNION
                        SELECT -1
                       ) T
                 GROUP BY x+n
                HAVING MAX(n) = -1
                ) upper_1
        ) upper_2
   full join (select lower_bound
             , rank () over (order by lower_bound) as lower_rank
          from (SELECT x+n as lower_bound
                  from test_gaps_in_sequence
                     , (SELECT 0 n
                        UNION
                        SELECT 1
                       ) T
                 GROUP BY x+n
                HAVING MIN(n) = 1
                ) lower_1
        ) lower_2
   on upper_2.upper_rank  = lower_2.lower_rank
     order by coalesce (lower_bound, upper_bound)

إذا قاعدة البيانات الخاصة بك يدعم الوظائف التحليليه ثم يمكنك استخدام استعلام شيئا مثل:

select prev+1, curr-1 from
( select webordernumber curr,
         coalesce (lag(webordernumber) over (order by webordernumber), 0) prev
  from   orders
)
where prev != curr-1;

الناتج سوف تظهر الثغرات على سبيل المثال

prev+1 curr-1
------ ------
     3      7

يعني أن الأعداد من 3 إلى 7 الشامل في عداد المفقودين.

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