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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
|
# name: test/sql/window/test_window_constant_aggregate.test
# description: Test "constant" aggregation (single result for each partition)
# group: [window]
statement ok
PRAGMA enable_verification
# Mix of constant/non-constant aggregate (sum and lead over same OVER clause)
query IIII
SELECT part, id, sum(val) OVER(PARTITION BY part ORDER BY id), lead(val) OVER(PARTITION BY part ORDER BY id)
FROM (SELECT range AS id, range % 5 AS part, range AS val FROM range(13)) t
ORDER BY ALL;
----
0 0 0 5
0 5 5 10
0 10 15 NULL
1 1 1 6
1 6 7 11
1 11 18 NULL
2 2 2 7
2 7 9 12
2 12 21 NULL
3 3 3 8
3 8 11 NULL
4 4 4 9
4 9 13 NULL
# Constant aggregate with non-simple_update
query III
SELECT part, id, list_sort(list(val) OVER(PARTITION BY part))
FROM (SELECT range AS id, range % 5 AS part, range AS val FROM range(13)) t
ORDER BY ALL;
----
0 0 [0, 5, 10]
0 5 [0, 5, 10]
0 10 [0, 5, 10]
1 1 [1, 6, 11]
1 6 [1, 6, 11]
1 11 [1, 6, 11]
2 2 [2, 7, 12]
2 7 [2, 7, 12]
2 12 [2, 7, 12]
3 3 [3, 8]
3 8 [3, 8]
4 4 [4, 9]
4 9 [4, 9]
# Constant aggregate with not-nicely-aligned partitions (e.g. partitions are 73, 75, 77, 79, 81, 83, ... rows)
query III
SELECT part, min(const) AS lo, max(const) AS hi
FROM (
SELECT part, sum(val) OVER(PARTITION BY part) as const
FROM (
(SELECT 1 AS part, range AS val FROM range(73))
UNION ALL
(SELECT 2 AS part, range AS val FROM range(75))
UNION ALL
(SELECT 3 AS part, range AS val FROM range(77))
UNION ALL
(SELECT 4 AS part, range AS val FROM range(79))
UNION ALL
(SELECT 5 AS part, range AS val FROM range(81))
UNION ALL
(SELECT 6 AS part, range AS val FROM range(83))
) u
) t
GROUP BY ALL
ORDER BY ALL
;
----
1 2628 2628
2 2775 2775
3 2926 2926
4 3081 3081
5 3240 3240
6 3403 3403
# Constant aggregate with large partitions (> vector size), also not nicely-aligned
query III
SELECT part, min(const) AS lo, max(const) AS hi
FROM (
SELECT part, sum(val) OVER(PARTITION BY part) AS const
FROM (
SELECT part, val
FROM (
(SELECT range as part, random() AS val FROM range(10)) r
CROSS JOIN
range(3000)
) p
) t
) w
GROUP BY ALL
HAVING lo <> hi
ORDER BY ALL
;
----
statement ok
CREATE TABLE issue7353 (
Season VARCHAR,
Medal VARCHAR,
Sex VARCHAR,
Ct INT,
Depth INT
);
statement ok
INSERT INTO issue7353 (Season, Medal, Sex, Ct, Depth) VALUES
(NULL, NULL, NULL, 271116, 0),
('Summer', NULL, NULL, 222552, 1),
('Winter', NULL, NULL, 48564, 1),
('Summer', 'NA', NULL, 188464, 2),
('Summer', 'Gold', NULL, 11459, 2),
('Winter', 'NA', NULL, 42869, 2),
('Summer', 'Bronze', NULL, 11409, 2),
('Winter', 'Bronze', NULL, 1886, 2),
('Winter', 'Gold', NULL, 1913, 2),
('Winter', 'Silver', NULL, 1896, 2),
('Summer', 'Silver', NULL, 11220, 2),
('Summer', 'NA', 'M', 138463, 3),
('Summer', 'Gold', 'M', 8319, 3),
('Winter', 'NA', 'F', 13268, 3),
('Winter', 'NA', 'M', 29601, 3),
('Summer', 'NA', 'F', 50001, 3),
('Summer', 'Bronze', 'M', 8235, 3),
('Winter', 'Bronze', 'M', 1289, 3),
('Winter', 'Gold', 'M', 1306, 3),
('Winter', 'Silver', 'M', 1289, 3),
('Summer', 'Gold', 'F', 3140, 3),
('Summer', 'Silver', 'M', 8092, 3),
('Summer', 'Bronze', 'F', 3174, 3),
('Summer', 'Silver', 'F', 3128, 3),
('Winter', 'Bronze', 'F', 597, 3),
('Winter', 'Gold', 'F', 607, 3),
('Winter', 'Silver', 'F', 607, 3);
# Calculate the max at the level Depth=1 and add to every row
statement ok
PRAGMA default_null_order='NULLS LAST';
query IIIIII
SELECT *, max(Ct) FILTER (WHERE Depth=1) OVER (PARTITION BY Season) as value_depth1
from issue7353
order by all;
----
Summer Bronze F 3174 3 222552
Summer Bronze M 8235 3 222552
Summer Bronze NULL 11409 2 222552
Summer Gold F 3140 3 222552
Summer Gold M 8319 3 222552
Summer Gold NULL 11459 2 222552
Summer NA F 50001 3 222552
Summer NA M 138463 3 222552
Summer NA NULL 188464 2 222552
Summer Silver F 3128 3 222552
Summer Silver M 8092 3 222552
Summer Silver NULL 11220 2 222552
Summer NULL NULL 222552 1 222552
Winter Bronze F 597 3 48564
Winter Bronze M 1289 3 48564
Winter Bronze NULL 1886 2 48564
Winter Gold F 607 3 48564
Winter Gold M 1306 3 48564
Winter Gold NULL 1913 2 48564
Winter NA F 13268 3 48564
Winter NA M 29601 3 48564
Winter NA NULL 42869 2 48564
Winter Silver F 607 3 48564
Winter Silver M 1289 3 48564
Winter Silver NULL 1896 2 48564
Winter NULL NULL 48564 1 48564
NULL NULL NULL 271116 0 NULL
# Test ORDER BY handling
query III
SELECT
i // 10 AS p,
i,
STRING_AGG(i, ',' ORDER BY i DESC) OVER(PARTITION BY p) AS c
FROM range(20) tbl(i)
ORDER BY ALL
----
0 0 9,8,7,6,5,4,3,2,1,0
0 1 9,8,7,6,5,4,3,2,1,0
0 2 9,8,7,6,5,4,3,2,1,0
0 3 9,8,7,6,5,4,3,2,1,0
0 4 9,8,7,6,5,4,3,2,1,0
0 5 9,8,7,6,5,4,3,2,1,0
0 6 9,8,7,6,5,4,3,2,1,0
0 7 9,8,7,6,5,4,3,2,1,0
0 8 9,8,7,6,5,4,3,2,1,0
0 9 9,8,7,6,5,4,3,2,1,0
1 10 19,18,17,16,15,14,13,12,11,10
1 11 19,18,17,16,15,14,13,12,11,10
1 12 19,18,17,16,15,14,13,12,11,10
1 13 19,18,17,16,15,14,13,12,11,10
1 14 19,18,17,16,15,14,13,12,11,10
1 15 19,18,17,16,15,14,13,12,11,10
1 16 19,18,17,16,15,14,13,12,11,10
1 17 19,18,17,16,15,14,13,12,11,10
1 18 19,18,17,16,15,14,13,12,11,10
1 19 19,18,17,16,15,14,13,12,11,10
# Test hash group with two partitions and blocks
statement ok
pragma threads=2
loop i 0 20
query III
with table_1 AS (
SELECT
'fb30cf47-6f6b-42ef-dec2-3f984479a2aa'::uuid AS id,
unnest(generate_series(
'2024-04-01'::date,
'2025-03-01'::date,
interval '1 month'
)) AS date
UNION ALL BY NAME
SELECT
'7d1cc557-2d45-6900-a1ed-b2c64f5d9200'::uuid AS id,
unnest(generate_series(
'2024-02-01'::date,
'2025-01-01'::date,
interval '1 month'
)) AS date
), table_2 AS (
SELECT
'fb30cf47-6f6b-42ef-dec2-3f984479a2aa'::uuid AS id,
unnest(generate_series(
'2024-04-01'::date,
'2025-03-01'::date,
interval '1 month'
)) AS date,
1 AS value
UNION ALL BY NAME
SELECT
'7d1cc557-2d45-6900-a1ed-b2c64f5d9200'::uuid AS id,
unnest(generate_series(
'2022-12-01'::date,
'2023-12-01'::date,
interval '1 month'
)) AS date,
1 AS value
), output AS (
SELECT
table_1.id,
table_1.date,
sum(table_2.value) over (
PARTITION BY table_1.id
ORDER BY table_1.date ASC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS test_sum,
FROM table_1
LEFT JOIN table_2
ON table_1.id = table_2.id
AND table_1.date = table_2.date
)
SELECT * FROM output
ORDER BY id DESC, date DESC;
----
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2025-03-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2025-02-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2025-01-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-12-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-11-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-10-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-09-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-08-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-07-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-06-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-05-01 00:00:00 12
fb30cf47-6f6b-42ef-dec2-3f984479a2aa 2024-04-01 00:00:00 12
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2025-01-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-12-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-11-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-10-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-09-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-08-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-07-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-06-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-05-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-04-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-03-01 00:00:00 NULL
7d1cc557-2d45-6900-a1ed-b2c64f5d9200 2024-02-01 00:00:00 NULL
endloop
# Test implicit ordering for aggregates
loop i 0 20
query I
with repro2 AS (
SELECT range // 59 AS id, random() AS value
FROM range(1475)
), X AS (
SELECT
list(value) OVER (
PARTITION BY id
ORDER BY value
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS values
FROM repro2
)
select count(*)
from X
where values[1] != list_aggregate(values, 'min')
----
0
endloop
|