summaryrefslogtreecommitdiff
path: root/mysql-test/main/win_first_last_value.result
blob: 4c3aa6a71615770321d564d3839ad1c512ecaef8 (plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
create table t1 (
pk int primary key,
a int,
b int,
c char(10),
d decimal(10, 3),
e real
);
insert into t1 values
( 1, 0, 1,    'one',    0.1,  0.001),
( 2, 0, 2,    'two',    0.2,  0.002),
( 3, 0, 3,    'three',  0.3,  0.003),
( 4, 1, 2,    'three',  0.4,  0.004),
( 5, 1, 1,    'two',    0.5,  0.005),
( 6, 1, 1,    'one',    0.6,  0.006),
( 7, 2, NULL, 'n_one',  0.5,  0.007),
( 8, 2, 1,    'n_two',  NULL, 0.008),
( 9, 2, 2,    NULL,     0.7,  0.009),
(10, 2, 0,    'n_four', 0.8,  0.010),
(11, 2, 10,   NULL,     0.9,  NULL);
select pk, first_value(pk) over (order by pk),
last_value(pk) over (order by pk),
first_value(pk) over (order by pk desc),
last_value(pk) over (order by pk desc)
from t1
order by pk desc;
pk	first_value(pk) over (order by pk)	last_value(pk) over (order by pk)	first_value(pk) over (order by pk desc)	last_value(pk) over (order by pk desc)
11	1	11	11	11
10	1	10	11	10
9	1	9	11	9
8	1	8	11	8
7	1	7	11	7
6	1	6	11	6
5	1	5	11	5
4	1	4	11	4
3	1	3	11	3
2	1	2	11	2
1	1	1	11	1
select pk,
first_value(pk) over (order by pk
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
last_value(pk) over (order by pk
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
first_value(pk) over (order by pk desc
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
last_value(pk) over (order by pk desc
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
from t1
order by pk;
pk	first_value(pk) over (order by pk
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)	last_value(pk) over (order by pk
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)	first_value(pk) over (order by pk desc
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)	last_value(pk) over (order by pk desc
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
1	1	11	11	1
2	1	11	11	1
3	1	11	11	1
4	1	11	11	1
5	1	11	11	1
6	1	11	11	1
7	1	11	11	1
8	1	11	11	1
9	1	11	11	1
10	1	11	11	1
11	1	11	11	1
select pk,
first_value(pk) over (order by pk desc),
last_value(pk) over (order by pk desc)
from t1;
pk	first_value(pk) over (order by pk desc)	last_value(pk) over (order by pk desc)
11	11	11
10	11	10
9	11	9
8	11	8
7	11	7
6	11	6
5	11	5
4	11	4
3	11	3
2	11	2
1	11	1
select pk, a, b, c, d, e,
first_value(b) over (partition by a order by pk) as fst_b,
last_value(b) over (partition by a order by pk) as lst_b,
first_value(c) over (partition by a order by pk) as fst_c,
last_value(c) over (partition by a order by pk) as lst_c,
first_value(d) over (partition by a order by pk) as fst_d,
last_value(d) over (partition by a order by pk) as lst_d,
first_value(e) over (partition by a order by pk) as fst_e,
last_value(e) over (partition by a order by pk) as lst_e
from t1;
pk	a	b	c	d	e	fst_b	lst_b	fst_c	lst_c	fst_d	lst_d	fst_e	lst_e
1	0	1	one	0.100	0.001	1	1	one	one	0.100	0.100	0.001	0.001
2	0	2	two	0.200	0.002	1	2	one	two	0.100	0.200	0.001	0.002
3	0	3	three	0.300	0.003	1	3	one	three	0.100	0.300	0.001	0.003
4	1	2	three	0.400	0.004	2	2	three	three	0.400	0.400	0.004	0.004
5	1	1	two	0.500	0.005	2	1	three	two	0.400	0.500	0.004	0.005
6	1	1	one	0.600	0.006	2	1	three	one	0.400	0.600	0.004	0.006
7	2	NULL	n_one	0.500	0.007	NULL	NULL	n_one	n_one	0.500	0.500	0.007	0.007
8	2	1	n_two	NULL	0.008	NULL	1	n_one	n_two	0.500	NULL	0.007	0.008
9	2	2	NULL	0.700	0.009	NULL	2	n_one	NULL	0.500	0.700	0.007	0.009
10	2	0	n_four	0.800	0.01	NULL	0	n_one	n_four	0.500	0.800	0.007	0.01
11	2	10	NULL	0.900	NULL	NULL	10	n_one	NULL	0.500	0.900	0.007	NULL
drop table t1;
#
# MDEV-11746: Wrong result upon using FIRST_VALUE with a window frame
#
create table t1 (i int);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
select i,
first_value(i) OVER (order by i rows between CURRENT ROW and 1 FOLLOWING) as fst_1f,
last_value(i) OVER (order by i rows between CURRENT ROW and 1 FOLLOWING) as last_1f,
first_value(i) OVER (order by i rows between 1 PRECEDING AND 1 FOLLOWING) as fst_1p1f,
last_value(i) OVER (order by i rows between 1 PRECEDING AND 1 FOLLOWING) as fst_1p1f,
first_value(i) OVER (order by i rows between 2 PRECEDING AND 1 PRECEDING) as fst_2p1p,
last_value(i) OVER (order by i rows between 2 PRECEDING AND 1 PRECEDING) as fst_2p1p,
first_value(i) OVER (order by i rows between 1 FOLLOWING AND 2 FOLLOWING) as fst_1f2f,
last_value(i) OVER (order by i rows between 1 FOLLOWING AND 2 FOLLOWING) as fst_1f2f
from t1;
i	fst_1f	last_1f	fst_1p1f	fst_1p1f	fst_2p1p	fst_2p1p	fst_1f2f	fst_1f2f
1	1	2	1	2	NULL	NULL	2	3
2	2	3	1	3	1	1	3	4
3	3	4	2	4	1	2	4	5
4	4	5	3	5	2	3	5	6
5	5	6	4	6	3	4	6	7
6	6	7	5	7	4	5	7	8
7	7	8	6	8	5	6	8	9
8	8	9	7	9	6	7	9	10
9	9	10	8	10	7	8	10	10
10	10	10	9	10	8	9	NULL	NULL
drop table t1;
#
# MDEV-12861 FIRST_VALUE() does not preserve the exact data type
#
CREATE TABLE t1 (a INT, b INT, c FLOAT);
INSERT INTO t1 VALUES (1,1,1),(1,2,2),(2,1,1),(2,2,2);
CREATE TABLE t2 AS SELECT a, FIRST_VALUE(b) OVER(), FIRST_VALUE(c) OVER() FROM t1 GROUP BY a;
SHOW CREATE TABLE t2;
Table	Create Table
t2	CREATE TABLE `t2` (
  `a` int(11) DEFAULT NULL,
  `FIRST_VALUE(b) OVER()` int(11) DEFAULT NULL,
  `FIRST_VALUE(c) OVER()` float DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t2,t1;