MONTHS_BETWEEN / NTH_VALUE - PullRequest
       4

MONTHS_BETWEEN / NTH_VALUE

0 голосов
/ 30 мая 2018

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

В этом приложении я просматриваю последние 4 сообщенных квартала для данного тикераусловное обозначение.Даты в таблице представлены в виде ГГГГММ, как в этом случае:

201804,
201801,
201710,
201704

Теперь, возможно, пропущена четверть.Возможно, компания не представила квартальный отчет или что-то в этом роде.

Итак, я пытаюсь выяснить, есть ли разрыв или пропущенный квартал:

201804,
201710,
201704,
201701

Здесь,201801 отсутствует ........ Я думаю, что каким-то образом мне нужно сравнить MONTHS_BETWEEN с текущей датой записи и значением даты LEAD 1, или NTH_VALUE 1, и увидеть, что разница составляет 3 месяца ....... за последние 4 записи назад (4 квартала).Если нет, какая-то запись отсутствует, и я верну значение NULL, чего требует приложение.

Есть мысли или уникальная логика?Или мне нужно кодировать функцию и вызывать ее?

Спасибо !!!

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете создать календарь кварталов и внешне объединить эти данные с вашими квартальными данными.Вот так выглядит запрос.p_start_year - это год начала вашего календаря, а p_no_of_qtrs подсчитывает, сколько кварталов отображается в календаре.

WITH
    mydata
    AS
        (SELECT '201804' AS quarter FROM DUAL
         UNION
         SELECT '201801' AS quarter FROM DUAL
         UNION
         SELECT '201710' AS quarter FROM DUAL
         UNION
         SELECT '201704' AS quarter FROM DUAL),
    calendar
    AS
        (SELECT TO_CHAR (
                    ADD_MONTHS (
                        TO_DATE (:p_start_year || '-01-01', 'YYYY-MM-DD'),
                        (LEVEL
                         - 1)
                        * 3
                    ),
                    'YYYYMM'
                )
                    AS quarter
         FROM DUAL
         CONNECT BY LEVEL <= :p_no_of_qtrs)
SELECT c.quarter, d.quarter AS status
FROM mydata d,
     calendar c
WHERE c.quarter = d.quarter(+)
ORDER BY c.quarter;

Это результат.

QUARTER | STATUS
201701  | 
201704  | 201704
201707  | 
201710  | 201710
201801  | 201801
201804  | 201804
201807  | 
201810  | 

Недостающие кварталы отображаются как NULL.

0 голосов
/ 30 мая 2018

Просто конвертируйте все в дату и используйте манипуляции с датами с самостоятельными объединениями

SQL Fiddle

With cte as (
  SELECT "val", 
          TO_DATE("val", 'YYYYMM') as original
  FROM Table1
)
SELECT c1."val", c1.original, 
       c2.original as next_quarter,
       c3.original as previous_quarter
FROM cte c1
LEFT JOIN cte c2
  ON c1.original = ADD_MONTHS(c2.original, -3)
LEFT JOIN cte c3
  ON c1.original = ADD_MONTHS(c3.original, 3)

ORDER BY c1."val"

ВЫХОД

|    val |             ORIGINAL |         NEXT_QUARTER |     PREVIOUS_QUARTER |
|--------|----------------------|----------------------|----------------------|
| 201701 | 2017-01-01T00:00:00Z | 2017-04-01T00:00:00Z |               (null) |
| 201704 | 2017-04-01T00:00:00Z |               (null) | 2017-01-01T00:00:00Z |
| 201710 | 2017-10-01T00:00:00Z |               (null) |               (null) |
| 201804 | 2018-04-01T00:00:00Z |               (null) |               (null) |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...