Files
email-tracker/external/duckdb/test/sql/aggregate/aggregates/test_last.test
2025-10-24 19:21:19 -05:00

189 lines
3.6 KiB
SQL

# name: test/sql/aggregate/aggregates/test_last.test
# description: Test the LAST function
# group: [aggregates]
statement ok
PRAGMA enable_verification
#
# Test all types
#
# Numerics
foreach type <numeric>
statement ok
CREATE TABLE five AS SELECT i::${type} AS i FROM range(1, 6, 1) t1(i)
query I
SELECT LAST(i) FROM five
----
5
query II
SELECT i % 3 AS g, LAST(i) FROM five GROUP BY 1 ORDER BY 1
----
0 3
1 4
2 5
query I
SELECT LAST(i ORDER BY 5-i) FROM five
----
1
query II
SELECT i % 3 AS g, LAST(i ORDER BY 5-i) FROM five GROUP BY 1 ORDER BY 1
----
0 3
1 1
2 2
statement ok
DROP TABLE five
endloop
# Decimals
foreach type decimal(4,1) decimal(8,1) decimal(12,1) decimal(18,1)
statement ok
CREATE TABLE five AS SELECT i::${type} AS i FROM range(1, 6, 1) t1(i)
query I
SELECT LAST(i ORDER BY 5-i) FROM five
----
1.0
query II
SELECT i::INTEGER % 3 AS g, LAST(i ORDER BY 5-i) FROM five GROUP BY 1 ORDER BY 1
----
0 3.0
1 1.0
2 2.0
statement ok
DROP TABLE five
endloop
# Temporal
statement ok
CREATE TABLE five_dates AS
SELECT
i::integer AS i,
'2021-08-20'::DATE + i::INTEGER AS d,
'2021-08-20'::TIMESTAMP + INTERVAL (i) HOUR AS dt,
'14:59:37'::TIME + INTERVAL (i) MINUTE AS t,
INTERVAL (i) SECOND AS s
FROM range(1, 6, 1) t1(i)
query IIII
SELECT LAST(d), LAST(dt), LAST(t), LAST(s) FROM five_dates
----
2021-08-25 2021-08-20 05:00:00 15:04:37 00:00:05
query IIIII
SELECT i % 3 AS g, LAST(d), LAST(dt), LAST(t), LAST(s)
FROM five_dates
GROUP BY 1
ORDER BY 1
----
0 2021-08-23 2021-08-20 03:00:00 15:02:37 00:00:03
1 2021-08-24 2021-08-20 04:00:00 15:03:37 00:00:04
2 2021-08-25 2021-08-20 05:00:00 15:04:37 00:00:05
query IIII
SELECT LAST(d ORDER BY 5-i), LAST(dt ORDER BY 5-i), LAST(t ORDER BY 5-i), LAST(s ORDER BY 5-i) FROM five_dates
----
2021-08-21 2021-08-20 01:00:00 15:00:37 00:00:01
query IIIII
SELECT i % 3 AS g, LAST(d ORDER BY 5-i), LAST(dt ORDER BY 5-i), LAST(t ORDER BY 5-i), LAST(s ORDER BY 5-i)
FROM five_dates
GROUP BY 1
ORDER BY 1
----
0 2021-08-23 2021-08-20 03:00:00 15:02:37 00:00:03
1 2021-08-21 2021-08-20 01:00:00 15:00:37 00:00:01
2 2021-08-22 2021-08-20 02:00:00 15:01:37 00:00:02
# WITH TIME ZONE
query II
SELECT LAST(dt::TIMESTAMPTZ), LAST(t::TIMETZ) FROM five_dates
----
2021-08-20 05:00:00+00 15:04:37+00
query III
SELECT i % 3 AS g, LAST(dt::TIMESTAMPTZ), LAST(t::TIMETZ)
FROM five_dates
GROUP BY 1
ORDER BY 1
----
0 2021-08-20 03:00:00+00 15:02:37+00
1 2021-08-20 04:00:00+00 15:03:37+00
2 2021-08-20 05:00:00+00 15:04:37+00
query II
SELECT LAST(dt::TIMESTAMPTZ ORDER BY 5-i), LAST(t::TIMETZ ORDER BY 5-i) FROM five_dates
----
2021-08-20 01:00:00+00 15:00:37+00
query III
SELECT i % 3 AS g, LAST(dt::TIMESTAMPTZ ORDER BY 5-i), LAST(t::TIMETZ ORDER BY 5-i)
FROM five_dates
GROUP BY 1
ORDER BY 1
----
0 2021-08-20 03:00:00+00 15:02:37+00
1 2021-08-20 01:00:00+00 15:00:37+00
2 2021-08-20 02:00:00+00 15:01:37+00
statement ok
DROP TABLE five_dates
# Complex
statement ok
CREATE TABLE five_complex AS
SELECT
i::integer AS i,
i::VARCHAR AS s,
[i] AS l,
{'a': i} AS r
FROM range(1, 6, 1) t1(i)
query III
SELECT LAST(s), LAST(l), LAST(r)
FROM five_complex
----
5 [5] {'a': 5}
query IIII
SELECT i % 3 AS g, LAST(s), LAST(l), LAST(r)
FROM five_complex
GROUP BY 1
ORDER BY 1
----
0 3 [3] {'a': 3}
1 4 [4] {'a': 4}
2 5 [5] {'a': 5}
query III
SELECT LAST(s ORDER BY 5-i), LAST(l ORDER BY 5-i), LAST(r ORDER BY 5-i)
FROM five_complex
----
1 [1] {'a': 1}
query IIII
SELECT i % 3 AS g, LAST(s ORDER BY 5-i), LAST(l ORDER BY 5-i), LAST(r ORDER BY 5-i)
FROM five_complex
GROUP BY 1
ORDER BY 1
----
0 3 [3] {'a': 3}
1 1 [1] {'a': 1}
2 2 [2] {'a': 2}
statement ok
DROP TABLE five_complex