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

  • שאלה

  • היי  השאלה שלי היא כזאת:

    יש לי טבלה עם שתי עמודות  :

    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

    תודה רבה מראש שרון.

    יום רביעי 18 יולי 2012 06:53

תשובות

  • היי שרון, 

    מצורף סקריפט שאמור לעזור לך. 

    הערה חשובה: הדרך שאני מציג בשאילתה זו היא "מתחכמת" ולא הכי יעילה. במידה ואתה עובד עם גרסת 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
    יום ראשון 22 יולי 2012 09:13

כל התגובות

  • היי שרון, 

    מצורף סקריפט שאמור לעזור לך. 

    הערה חשובה: הדרך שאני מציג בשאילתה זו היא "מתחכמת" ולא הכי יעילה. במידה ואתה עובד עם גרסת 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
    יום ראשון 22 יולי 2012 09:13