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=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
DROP TABLE t2,t1;
|