التحقق من التسلسل مع استعلام SQL
-
03-07-2019 - |
سؤال
لدي جدول الأوامر التي تحافظ على كل أمر من كل محلاتنا.كتبت استعلام إلى التحقق من تسلسل أوامر لكل مخزن.يبدو مثل هذا.
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 الشامل في عداد المفقودين.