WITH prices AS (...)
SELECT ...
FROM prices
UNION ALL
SELECT active_to as active_from, ...
FROM prices
WHERE active_to IS NOT NULL
о есть более поздний интрвал имеет бОльший приоритет, чем более ранний?
в виде хранимой процедуры со стеком
...
WHERE now() BETWEEN "active_from" AND coalesce("active_to", now())
WITH
prices (row_id, product_id, active_from, active_to, price) AS (
VALUES
(1, 1, '2019-01-01'::date, null, 200),
(2, 1, '2019-10-01'::date, null, 150),
(3, 1, '2019-11-01'::date, '2019-11-30'::date, 100),
(4, 2, '2019-01-01'::date, null, 200),
(5, 2, '2019-06-01'::date, '2019-08-31'::date, 150),
(6, 2, '2019-07-01'::date, '2019-09-30'::date, 140),
(7, 2, '2019-11-01'::date, null, 100),
(8, 3, '2019-01-01'::date, null, 200),
(9, 3, '2019-06-01'::date, '2019-10-31'::date, 150),
(10, 3, '2019-07-01'::date, '2019-09-30'::date, 140),
(11, 3, '2019-11-01'::date, null, 100)
)
SELECT DISTINCT ON (product_id) *, lag("price") OVER (PARTITION BY "product_id" ORDER BY "active_from")
FROM prices
ORDER BY product_id, "active_from" DESC
function func(array $par) {
echo $par[0], PHP_EOL;
echo memory_get_usage(), PHP_EOL;
}
function func2(array $par) {
$par[0] += 17;
echo $par[0], PHP_EOL;
echo memory_get_usage(), PHP_EOL;
}
echo memory_get_usage(), PHP_EOL;
$arr = array_fill(0, 1000000, 12);
echo memory_get_usage(), PHP_EOL;
func($arr);
func2($arr);
126416
52320928
12
52320944
29
104515392
своя агрегирующая функция тоже как вариант, но пока раздумываю по тем же соображениям