Запрос SQL Server для получения первого и последнего значения - PullRequest
0 голосов
/ 10 мая 2018

У меня есть таблица с FieldID, ChangeField, OldValue, NewValue and ChangeDate, как показано ниже:

FieldID   ChangeField  OldValue   NewValue   ChangeDate
1         interest     1.5        1.2        2018-05-01 13:00:00
1         interest     1.2        1.3        2018-05-01 14:00:00
1         quantity     2          1          2018-05-01 15:00:00
1         quantity     1          2          2018-05-01 16:00:00
1         quantity     2          3          2018-05-01 17:00:00
2         quantity     10         20         2018-05-01 18:00:00
2         quantity     20         30         2018-05-01 19:00:00

Возможно ли получить первые и последние изменения для каждого ChangeField для FieldID, например, приведенный ниже результат?

FieldID ChangeField     OldValue    NewValue    dtChangeDate
1       interest        1.5         1.3     2018-05-01 14:00:00  
--> The original value for interest was 1.5, the last value for interest is 1.3
1       quantity        2           3       2018-05-01 17:00:00  
--> The original value for quantity was 2, the last value for interest is 3
2       quantity        10          30      2018-05-01 19:00:00  
--> The original value for quantity was 10, the last value for interest is 30

Обратите внимание, что ChangeDate всегда самая последняя ChangeDate

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Вы можете попробовать запрос, как показано ниже:

посмотреть демоверсию

;with cte as
( 
    select
    *,
    rn1= row_number() over (partition by FieldID,ChangeField order by ChangeDate asc),
    rn2= row_number() over (partition by FieldID,ChangeField order by ChangeDate desc)
    from
    Tbl
)

select 
    FieldId,
    ChangeField,
    ChangeDate=MAX(ChangeDate),
    Oldvalue= MAX(Case when rn1=1 then Oldvalue end),
    NewValue= MAX(Case when rn2=1 then NewValue end)
from cte 
    where  rn1=1 or rn2=1
group by 
    FieldId,ChangeField
0 голосов
/ 10 мая 2018

Используйте first_value() и last_value ()

select distinct * 
from (
  select FieldID, ChangeField  
       first_value(OldValue) over (partition by FieldID, ChangeField order by ChangeDate) OldValue,
       last_value(OldValue) over (partition by FieldID, ChangeField order by ChangeDate) NewValue,
       last_value(OldValue) over (partition by FieldID, ChangeField order by ChangeDate) dtChangeDate
  from table t
) t;
0 голосов
/ 10 мая 2018

Вы можете использовать ROW_NUMBER(), чтобы получить самый старый / самый новый.

;WITH Boundaries AS
(
    SELECT
        T.FieldID,
        T.ChangeField,
        T.OldValue,
        T.NewValue,
        OldestRanking = ROW_NUMBER() OVER (
            PARTITION BY
                T.FieldID,
                T.ChangeField
            ORDER BY
                T.ChangeDate ASC),
        NewestRanking = ROW_NUMBER() OVER (
            PARTITION BY
                T.FieldID,
                T.ChangeField
            ORDER BY
                T.ChangeDate DESC)
    FROM
        YourTable AS T
)
SELECT
    T.FieldID,
    T.ChangeField,
    T.OldValue,
    OldValueDate = T.ChangeDate,
    N.NewValue,
    NewValueDate = N.ChangeDate,
FROM
    Boundaries AS T
    INNER JOIN Boundaries AS N ON 
        T.FieldID = N.FieldID AND
        T.ChangeField  = N.ChangeField
WHERE
    T.OldestRanking = 1 AND
    N.NewestRanking = 1
0 голосов
/ 10 мая 2018

Вы можете попробовать следующий код, я использовал FIRST_VALUE() для получения первого значения в столбце OldValue и LAST_VALUE() для получения последних значений группы для NewValue и dtChangeDate.

    SELECT
    FieldID,
    ChangeField,
    FIRST_VALUE(OldValue) OVER (PARTITION BY
                                    fieldID, ChangeField
                                ORDER BY FieldID
                               )  AS OldValue,
    LAST_VALUE(NewValue) OVER (PARTITION BY
                                   fieldID, ChangeField
                               ORDER BY FieldID
                              )   AS NewValue,
    LAST_VALUE(ChangeDate) OVER (PARTITION BY
                                     fieldID, ChangeField
                                 ORDER BY FieldID
                                ) AS dtChangeDate
    FROM YourTable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...