Spotfire date difference using over function

前端 未结 2 652
孤独总比滥情好
孤独总比滥情好 2021-01-25 09:44

I have the following data set:

Item  ||  Date       || Client ID || Date difference
A     ||  12/12/2014 || 102       || 
A     ||  13/12/2014 || 102       || 1
         


        
相关标签:
2条回答
  • 2021-01-25 10:24

    EDIT 2015.07.15

    got it, so if you want the difference from the last customer-date pair. this expression will give you the table you've listed above. spacing for readability:

    DateDiff('day',
      First([Date) OVER (Intersect([ClientId], Previous([Date]))),
      [Date]
    )
    

    Table viz of sample data plus this Calculated Column


    EDIT 2015.07.13

    if you want to reduce this so that you can accurately aggregate [Days], you can surround the above expression with an If(). I'll add some spacing to make this more readable:

    If(
        [Date] = Min([Date]) OVER Intersect([ClientId], [Item]), 
        DateDiff( 'day', 
            Min([Date]) OVER Intersect([ClientId], [Item]), 
            Max([Date]) OVER Intersect([ClientId], [Item])
        )
        , 0
    )
    

    in English: "If the value of the [Date] column in this row matches the earliest date for this [ItemId] and [ClientId] combination, then put the number of days difference between the first and last [Date] for this [ItemId] and [ClientId] combination; otherwise, put zero."

    it results in something like:

    Item    ClientId    Date        Days
    A       102         2014.12.12  1
    A       102         2014.12.13  0
    B       141         2014.12.12  5
    B       141         2014.12.17  0
    C       123         2014.12.01  2
    C       123         2014.12.02  0
    C       123         2014.12.03  0
    

    WARNING that filters may break this calculation. for example, if you are filtering based on [Date] and, with the above table as an example, filter OUT all dates before 2014.12.13, Sum([Date]) will be 7 instead of 8 (because the first row has been filtered out).


    you can use Spotfire's OVER functions to look at data points with common IDs across rows.

    it looks like you've only got two rows per Client ID and Item ID, which helps us out! use the following formula:

    DateDiff('day', Min([Date]) OVER Intersect([ClientId], [Item]), Max([Date]) OVER Intersect([ClientId], [Item]))
    

    this will give you a column with the number of days difference between the two dates in each row:

    Item    ClientId    Date        Days
    A       102         2014.12.12  1
    A       102         2014.12.13  1
    B       141         2014.12.12  5
    B       141         2014.12.17  5
    
    0 讨论(0)
  • 2021-01-25 10:43

    I used the following solution to deal with groups that had more than 2 rows/dates.

    First create a calculated column to provide a rank order by date within each group:

    RankDatePerUnit:

      Rank([EventDate],[Group_Name])
    

    Then another calculated column to do the date diff using an over expression to reference the previous date within the group.

    TimeSinceLastEvent:

    DateDiff("day",
       First([EventDate]) OVER (Intersect([Group_Name], Previous([RankDatePerUnit]))),
       [EventDate])
    

    Note: Duplicate date could be handled differently by using denserank. The above approach will not calculate a zero date diff between two rows from the same group with a duplicate time. They'll both calculate their delta from an earlier date within the same group if one exists.

    0 讨论(0)
提交回复
热议问题