У вас не может быть подзапроса или функции для этого, Марко.
Вы можете присоединиться к календарю и суммировать праздники в основном запросе, но вы должны сгруппировать основной запрос, я боятся. Я попытался - см. Ниже, где я также вставил сообщение об ошибке:
WITH
-- this is input - not part of the real query
calendar(date_dt,holiday) AS (
SELECT DATE '2020-01-01',1
UNION ALL SELECT DATE '2020-01-02',0
UNION ALL SELECT DATE '2020-01-03',0
UNION ALL SELECT DATE '2020-01-04',1
UNION ALL SELECT DATE '2020-01-05',1
UNION ALL SELECT DATE '2020-01-06',1
UNION ALL SELECT DATE '2020-01-07',0
UNION ALL SELECT DATE '2020-01-08',0
UNION ALL SELECT DATE '2020-01-09',0
UNION ALL SELECT DATE '2020-01-10',0
UNION ALL SELECT DATE '2020-01-11',1
UNION ALL SELECT DATE '2020-01-12',1
)
,
-- this is also input ...
item(item,start_dt,end_dt) AS (
SELECT 1,DATE '2020-01-01',DATE '2020-01-11'
UNION ALL SELECT 2,DATE '2020-01-01',DATE '2020-01-05'
)
-- main query starts here ...
SELECT
i.*
, SUM(holiday) AS holidays
FROM item i
JOIN calendar c ON date_dt BETWEEN start_dt AND end_dt
GROUP BY 1,2,3
ORDER BY item;
-- out item | start_dt | end_dt | holidays
-- out ------+------------+------------+----------
-- out 1 | 2020-01-01 | 2020-01-11 | 5
-- out 2 | 2020-01-01 | 2020-01-05 | 3
-- out (2 rows)
-- out
-- out Time: First fetch (2 rows): 18.743 ms. All rows formatted: 18.783 ms
Коррелированный сгруппированный подзапрос, который присоединяется к предикату диапазона, не работает:
SELECT
i.*
, (
SELECT SUM((NOT is_busday)::INT)
FROM calendar c
WHERE date_dt BETWEEN start_dt AND end_dt
) AS holidays
FROM item i
;
-- out ERROR 4160: Non-equality correlated subquery expression is not supported