range Overlap range SQL
-
אתגר מעניין, לחפש טווח שחופף עם טווח, בשבילי זה צורך אקוטי כרגע.
הנה דוגמא:declare @range1 table (id int identity ,fromyear int,toyear int); declare @range2 table ( id int identity , fromyear int,toyear int); insert into @range1 (fromyear,toyear) values(2000,2011),(2005,2010) insert into @range2 (fromyear,toyear) values(2003,2007),(2011,2015) select r1.id as id1 , r2.id as id2 from @range1 r1, @range2 r2 --where ????
מה שאני צריך זה שאם ישנה חפיפה כלשהי כלומר -- ששנה אחת (או יותר) הנמצאת בתוך הטווח של השנים בטבלה 2 -- היא: נמצאת בתוך הטווח של השנים של טבלה 1 הוא יקבל שורה. שתציג לי את id של טבלה 1 ו id של טבלה 2 לאמור: כאן יש חפיפה כלשהי (איזו שנה???? לא משנה לי כרגע!!!)
עריכה: למי שלא הבין מה אני רוצה, אנסח את זה עם דוגמא: נניח שיש לנו 2 אנשים ראובן ושמעון, שניהם בוודאי עבדו בבזק שנה אחת או יותר, אנחנו צריכים שהאלגוריתם יגיד לנו האם הם עבדו ביחד בבזק שנה אחת לפחות. האם ישנה דרך לעשות את זה ב SQL ללא יצירת טבלה נוספת אמצעית (שזה פשוט שאפשרי הואיל ואנחנו יכולים לעשות join פשוט כמו כאן)
פורסם במקור בפורום CODE613 ב17/02/2015 21:45 (+02:00)
-
אם שנה מסויימת נמצאת בטווח בהכרח שאחד הגבולות הוא גם בתוך הטווח. אז:
select r1.id as id1 , r2.id as id2 from @range1 r1, @range2 r2 WHERE r2.fromyear between r1.fromyear and r1.toyear OR r2.toyear between r1.fromyear and r1.toyear
ככה נראה לי.
פורסם במקור בפורום CODE613 ב17/02/2015 22:03 (+02:00)
-
האלגוריתם שלך שקרן יען איננו מכסה מצב שבו הטווח השני גדול בהרבה מן הראשון, והשנים שבאמצע כולם בפנים.
כזה:
r1 = 1990-2015
r2= 2005-2009
או להיפך... בכל מקרה הם נפגשו שם בעבודה בין השנים 2005-2009 והתנאים שלך לא מתקיימים שם.פורסם במקור בפורום CODE613 ב18/02/2015 00:48 (+02:00)
-
@דוד ל.ט.
אלא ביטוי שזה לא נתמך בON נראה לי
כל דבר נתמך ב on נראה לי.
וכדי לא להיראות גולם הנבהל להשיב ב"נראה לי" השקעתי דקה וחצי להתקדם קצת בחיים:declare @t1 table (id int ,id2 int ); declare @t2 table ( id int ); insert into @t1 (id,id2) values(1,3) insert into @t2 (id) values(2) select * from @t1 t1 inner join @t2 t2 on t2.id between t1.id and t1.id2
פורסם במקור בפורום CODE613 ב18/02/2015 00:49 (+02:00)
-
אז זה הפתרון האולטימטיבי:
דוד זה בזכותך!
נתתי לך תודה.declare @range1 table (id int identity ,fromyear int,toyear int); declare @range2 table ( id int identity , fromyear int,toyear int); insert into @range1 (fromyear,toyear) values(2000,2011),(2005,2010) insert into @range2 (fromyear,toyear) values(2003,2007),(2011,2015) select r1.id as id1 , r2.id as id2 from @range1 r1 inner join @range2 r2 on r1.fromyear between r2.fromyear and r2.toyear or r1.toyear between r2.fromyear and r2.toyear or r2.fromyear between r1.fromyear and r1.toyear or r2.toyear between r1.fromyear and r1.toyear
פורסם במקור בפורום CODE613 ב18/02/2015 09:37 (+02:00)