-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpart3 lag.sql
More file actions
70 lines (63 loc) · 2.18 KB
/
part3 lag.sql
File metadata and controls
70 lines (63 loc) · 2.18 KB
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
65
66
67
68
69
70
SELECT custid, orderid, val,
FIRST_VALUE(val) OVER(PARTITION BY custid ORDER BY orderdate, orderid) AS val_firstorder,
LAST_VALUE(val) OVER(PARTITION BY custid ORDER BY orderdate, orderid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS val_lasorder
FROM Sales.OrderValues
WITH C AS
(
SELECT custid, orderid, val,
FIRST_VALUE(val) OVER(PARTITION BY custid ORDER BY orderdate, orderid) AS val_firstorder,
LAST_VALUE(val) OVER(PARTITION BY custid ORDER BY orderdate, orderid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS val_lastorder,
ROW_NUMBER() OVER(PARTITION BY custid ORDER BY (SELECT NULL)) AS rownum
FROM Sales.OrderValues
)
SELECT custid, val_firstorder, val_lastorder
FROM C
WHERE rownum = 1
WITH OrdersRN AS
(
SELECT custid, val,
ROW_NUMBER() OVER(PARTITION BY custid ORDER BY orderdate, orderid) AS rna,
ROW_NUMBER() OVER(PARTITION BY custid ORDER BY orderdate DESC, orderid DESC) AS rnd
FROM Sales.OrderValues
)
SELECT custid,
MAX(CASE WHEN rna = 1 THEN val END) AS firstorerval,
MAX(CASE WHEN rna = 1 THEN val END) AS lastorerval,
MAX(CASE WHEN rna = 3 THEN val END) AS thirdorerval
FROM OrdersRN
GROUP BY custid
SELECT custid,
CONVERT(CHAR(8), orderdate, 112) + STR(orderid, 10) + STR(val, 14, 2)
COLLATE Latin1_General_BIN2 AS s
FROM Sales.OrderValues
WITH C AS
(
SELECT custid,
CONVERT(CHAR(8), orderdate, 112) + STR(orderid, 10) + STR(val, 14, 2)
COLLATE Latin1_General_BIN2 AS s
FROM Sales.OrderValues
)
SELECT custid,
CAST(SUBSTRING(MIN(s), 19, 14) AS NUMERIC(12, 2)) AS firstorderval,
CAST(SUBSTRING(MAX(s), 19, 14) AS NUMERIC(12, 2)) AS lastorderval
FROM C
GROUP BY custid
WITH C AS
(
SELECT custid,
CONVERT(CHAR(8), orderdate, 112)
+ CASE SIGN(orderid) WHEN -1 THEN '0' ELSE '1' END
--îòðèöàòåëüíûå âåëè÷èíû ñîðòèðóþòñÿ äî íåîòðèöàòåëüíûõ
+ STR(CASE SIGN(orderid)
WHEN -1 THEN 2147383648
--ê îòðèèöàòåëüíûì âåëè÷èíàì äîáàâëÿåì ABS(minnegative)
ELSE 0 END + orderid, 10)
+ STR(val, 14, 2)
COLLATE Latin1_General_BIN2 AS s
FROM Sales.OrderValues
)
SELECT custid,
CAST(SUBSTRING(MIN(s), 19, 14) AS NUMERIC(12, 2)) AS firstorderval,
CAST(SUBSTRING(MAX(s), 19, 14) AS NUMERIC(12, 2)) AS lastorderval
FROM C
GROUP BY custid