-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfirst_value_last_value.sql
64 lines (54 loc) · 1.36 KB
/
first_value_last_value.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
USE TestDB
GO
-- Let's create a test table
CREATE TABLE dbo.ItemsFirstValue
(
ID INT IDENTITY(1,1) PRIMARY KEY
, ItemID VARCHAR(40)
, Value1 INT NULL
, Value2 INT NULL
)
-- And insert some data
INSERT INTO dbo.ItemsFirstValue
SELECT 'Item1', 12, 78 UNION ALL
SELECT 'Item1', 12, NULL UNION ALL
SELECT 'Item1', 12, NULL UNION ALL
SELECT 'Item2', 44, 46 UNION ALL
SELECT 'Item2', 44, NULL UNION ALL
SELECT 'Item2', 44, NULL UNION ALL
SELECT 'Item2', 44, NULL UNION ALL
SELECT 'Item2', 44, NULL UNION ALL
SELECT 'Item3', 53, 90 UNION ALL
SELECT 'Item3', 53, NULL UNION ALL
SELECT 'Item4', 75, 36 UNION ALL
SELECT 'Item4', 75, NULL UNION ALL
SELECT 'Item4', 75, NULL
-- Getting the first value of the partition
SELECT
ID, ItemID, Value1, value2
, FIRST_VALUE(Value2) OVER(PARTITION BY ItemID ORDER BY ID ASC) AS FirstVal
FROM
dbo.ItemsFirstValue;
USE AdventureWorks
GO
-- Wrong Last Value
SELECT
CustomerID
, SalesOrderID
, TotalDue
, LAST_VALUE(TotalDue) OVER(PARTITION BY CustomerID ORDER BY SalesOrderID) AS AmountLastValue
FROM
Sales.SalesOrderHeader
ORDER BY
CustomerID, SalesOrderID;
-- Correct Last Value
SELECT
CustomerID
, SalesOrderID
, TotalDue
, LAST_VALUE(TotalDue) OVER(PARTITION BY CustomerID ORDER BY SalesOrderID
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS AmountLastValue
FROM
Sales.SalesOrderHeader
ORDER BY
CustomerID, SalesOrderID;