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)
