משיב מוביל
עזרה ב שאילתה קצת מורכבת

שאלה
-
היי השאלה שלי היא כזאת:
יש לי טבלה עם שתי עמודות :
1) עמודה datetime
2) עמודת סטטוס
בעמודה הסטטוס יש שלושה ערכים בלבד 0,1,2 ( כאשר 1 2 הם אותו דבר מבחינתי) אני מעוניין לרוץ על העמודה וכל פעם שאני רואה שינוי מ אפס
לשתיים או מאפס ל1 או מ 1 או שתיים לאפס לתפוס את השורה שבה קרה השינוי אני אתן דוגמא:
א) 0 13:00
ב) 0 14:00
ג) 0 15:00
ד) 1 16:00
ה) 2: 17:00
ו ) 2 18:00
ז) 1 19:00
ח) 0 20:00
ט) 0 21:00
י) 2 22:00
התוצאה שאותה אני מעוניין לקבל היא:
א) 0 13:00
ד) 1 16:00
ח) 0 20:00
י) 1 22:00
תודה רבה מראש שרון.
תשובות
-
היי שרון,
מצורף סקריפט שאמור לעזור לך.
הערה חשובה: הדרך שאני מציג בשאילתה זו היא "מתחכמת" ולא הכי יעילה. במידה ואתה עובד עם גרסת 2012 אתה יכול להיעזר בפונקציית LEG אשר מיועדת בדיוק למקרים האלו.
מקווה שעזרתי,
יוסי חקיקת
CREATE TABLE #Tmp (RowTime Time, Status TINYINT) INSERT INTO #Tmp (RowTime,[Status]) VALUES ('13:00',0), ('14:00',0), ('15:00',0), ('16:00',1), ('17:00',2), ('18:00',2), ('19:00',1), ('20:00',0), ('21:00',0), ('22:00',2) SELECT MIN(Derived.RowTime)AS RowTime, Derived.[Status] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY t.RowTime ASC) AS RN, ROW_NUMBER() OVER (PARTITION BY CASE [Status] WHEN 2 THEN 1 ELSE [Status] END ORDER BY t.RowTime ASC) AS RN2, ROW_NUMBER() OVER (ORDER BY t.RowTime ASC)- ROW_NUMBER() OVER (PARTITION BY CASE [Status] WHEN 2 THEN 1 ELSE [Status] END ORDER BY t.RowTime ASC) AS Dif, CASE [Status] WHEN 2 THEN 1 ELSE [Status] END as [Status], t.RowTime FROM #Tmp AS t ) AS Derived GROUP BY Derived.[Status],Derived.Dif
- הוצע כתשובה על-ידי tetitu יום ראשון 22 יולי 2012 09:24
- נערך על-ידי Yossi Hakikat יום ראשון 22 יולי 2012 13:03
- סומן כתשובה על-ידי Ami Levin יום שני 30 יולי 2012 13:35
כל התגובות
-
-
היי שרון,
מצורף סקריפט שאמור לעזור לך.
הערה חשובה: הדרך שאני מציג בשאילתה זו היא "מתחכמת" ולא הכי יעילה. במידה ואתה עובד עם גרסת 2012 אתה יכול להיעזר בפונקציית LEG אשר מיועדת בדיוק למקרים האלו.
מקווה שעזרתי,
יוסי חקיקת
CREATE TABLE #Tmp (RowTime Time, Status TINYINT) INSERT INTO #Tmp (RowTime,[Status]) VALUES ('13:00',0), ('14:00',0), ('15:00',0), ('16:00',1), ('17:00',2), ('18:00',2), ('19:00',1), ('20:00',0), ('21:00',0), ('22:00',2) SELECT MIN(Derived.RowTime)AS RowTime, Derived.[Status] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY t.RowTime ASC) AS RN, ROW_NUMBER() OVER (PARTITION BY CASE [Status] WHEN 2 THEN 1 ELSE [Status] END ORDER BY t.RowTime ASC) AS RN2, ROW_NUMBER() OVER (ORDER BY t.RowTime ASC)- ROW_NUMBER() OVER (PARTITION BY CASE [Status] WHEN 2 THEN 1 ELSE [Status] END ORDER BY t.RowTime ASC) AS Dif, CASE [Status] WHEN 2 THEN 1 ELSE [Status] END as [Status], t.RowTime FROM #Tmp AS t ) AS Derived GROUP BY Derived.[Status],Derived.Dif
- הוצע כתשובה על-ידי tetitu יום ראשון 22 יולי 2012 09:24
- נערך על-ידי Yossi Hakikat יום ראשון 22 יולי 2012 13:03
- סומן כתשובה על-ידי Ami Levin יום שני 30 יולי 2012 13:35