none
עדכון טבלה ב SQL RRS feed

  • שאלה

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

    יש לי טבלה עם שני עמודות account number  ו  datetime   עכשיו היא נראית ככה:

    name  time

    xxx       16:00

    yyy     17:00

    zzz  18:00

     אני מעוניין לצור select  שתוצאות שלו ייראו כך:

    name  starttime  end time

    xxx        16:00            17:00

    yyy          17:00        18:000     

     

     האם זה אפשרי  אשמח לשמוע פתרונות

    שרון

    יום ראשון 06 מרץ 2011 10:11

תשובות

  • הי שרון,

    A.FlowId = B.FlowId And A.RowId < B.RowId

    מתבצעת התאמה עבור כל רשומה ב- select הראשי עם רשומה מה- select הפנימי כך ש- FlowId = FlowId ו- , פה הטריק, הרשומה ב- Outer Apply clause צריכה להיות גדולה מהרשומה הראשית.

    אני בחרתי את הרשומה "הבא" ע"י השוואה על מס רץ אך אפשר גם לבחור שדה תאריך, לדוגמא.

    בנוסף יש לי בקשה קטנה, אנא תעבור על הפוסטים שלך ובמידה וכבר קיבלת תשובות תסגור אותם.

    המשך שבוע טוב,

    אסף


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 06 מרץ 2011 13:20
    יום ראשון 06 מרץ 2011 13:15

כל התגובות

  •    

    תיקון קטן :

    name       time

    xxx       16:00

    xxx       17:00

    xxx      18:00

    15:00    yyy      

    yyy   16:00

    yyy     17:30

    פלט:

    name   startdate  endate

    xxx   16:00  17:00   

    xxx   17:00    18:00

    yyy   15:00  16:00

    yyy    16:00  17:30

    תודה שרון

     

     

     

     

     

            zzz       18:00

     

    יום ראשון 06 מרץ 2011 10:28
  • הי שרון,

    צירפתי קוד פשוט, ישנם דרכים רבות לבצע את הפעולה אני ישתמשתי ב- outer apply עם הרשומה הבאה מאותו מזהה.

    אפשר להשתמש גם ב- self join עם יש עמודת identity או למיין לפי השעה.

    במידה והטבלה גדולה רצוי לעשות אופטימיזציה ע"י אינדקסים, וגם עם לא :).

    יום טוב,

    אסף

    Declare @Flows table (RowId int not null identity(1,1), FlowId char(10), Time1 datetime)
    Insert @Flows (FlowId, Time1)
    Select 'AAA' , '16:00' Union All
    Select 'AAA' , '17:00' Union All
    Select 'AAA' , '18:00' Union All
    Select 'BBB' , '16:00' Union All
    Select 'BBB' , '18:00'
    
    Select FlowId, Convert(nvarchar(2), datepart(hh, A.time1)) + ':00', Convert(nvarchar(2), datepart(hh,Q.Time1)) + ':00' 
    From @Flows A 
    Outer Apply
    (
    	Select top 1 B.Time1
    	From @Flows B
    	Where A.FlowId = B.FlowId And A.RowId < B.RowId
    	Order by B.RowId Asc
    )Q
    Where Q.Time1 is not null
    

    אסף שלם
    יום ראשון 06 מרץ 2011 11:00
  •   אסף קודם כל תודה רבה   נראה לי שפתרת לי את הבעיה  אבל מה שרציתי לדעת    בנוסף  עלפי איזה שדה  ה outer apply עושה את ה join

    עם  השאילתה הפנימית.

    תודה שרון

    יום ראשון 06 מרץ 2011 12:59
  • הי שרון,

    A.FlowId = B.FlowId And A.RowId < B.RowId

    מתבצעת התאמה עבור כל רשומה ב- select הראשי עם רשומה מה- select הפנימי כך ש- FlowId = FlowId ו- , פה הטריק, הרשומה ב- Outer Apply clause צריכה להיות גדולה מהרשומה הראשית.

    אני בחרתי את הרשומה "הבא" ע"י השוואה על מס רץ אך אפשר גם לבחור שדה תאריך, לדוגמא.

    בנוסף יש לי בקשה קטנה, אנא תעבור על הפוסטים שלך ובמידה וכבר קיבלת תשובות תסגור אותם.

    המשך שבוע טוב,

    אסף


    אסף שלם
    • סומן כתשובה על-ידי sharonof יום ראשון 06 מרץ 2011 13:20
    יום ראשון 06 מרץ 2011 13:15