подзапрос или пользовательская функция в Vertica - PullRequest
0 голосов
/ 02 февраля 2020

В Vertica, как я могу создать пользовательскую функцию для поиска общего числа выходных дней между StartDate и EndDate?

, например:

У меня есть две таблицы

  1. таблица «calendar_day» для хранения календарных дней
______________________
|  date    | holiday |
______________________
| 1 Jan 20 |    1    |
______________________
| 2 Jan 20 |    0    |
______________________
| 3 Jan 20 |    0    |
______________________
*1 = Holiday
0 <> Holiday
таблица «ПУНКТ» для хранения данных, включая начальную и конечную даты для каждого элемента.
________________________________________
| ITEM    |  StartDate     |  EndDate   |
________________________________________
|   1     |  1 Jan 20      |  3 Jan     |
________________________________________
|   2     |  1 Jan 20      |  5 Jan     |
________________________________________
.
.
.

Итак, я хотел бы узнать, сколько праздничных дней между StartDate и EndDate для каждого запись элемента.

как

select sum(holiday)
from calendar_day
where date between StartDate and EndDate

как создать подзапрос или функцию для получения результата?

Большое спасибо.

1 Ответ

0 голосов
/ 05 февраля 2020

У вас не может быть подзапроса или функции для этого, Марко.

Вы можете присоединиться к календарю и суммировать праздники в основном запросе, но вы должны сгруппировать основной запрос, я боятся. Я попытался - см. Ниже, где я также вставил сообщение об ошибке:

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
...