SQL Server 查询获取第一个和最后一个值

fau*_*ong 4 sql t-sql sql-server

我有一张表格,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
Run Code Online (Sandbox Code Playgroud)

是否可以获取每个 FieldID 的每个 ChangeField 的第一个和最后一个更改,例如下面的结果?

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
Run Code Online (Sandbox Code Playgroud)

请注意,ChangeDate 始终是最新的 ChangeDate

Aur*_*ura 6

您可以尝试以下代码,我已用于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;
Run Code Online (Sandbox Code Playgroud)