oracle sql вопрос, строка между предыдущими - PullRequest
0 голосов
/ 06 ноября 2018

Мне нужна помощь в понимании приведенной ниже части запроса Oracle SQL. Что делает МЕЖДУ 7 PRECEDING и 7 PRECEDING? Я понимаю, что транспортное средство может иметь более одной даты репо, если повторено более одного раза для этой учетной записи. Тем не менее, этот код строит репо даты 1-7, как это, и я не уверен, что именно это делает. Если кто-то может объяснить, пожалуйста, высоко ценится. Спасибо

, MIN(D0AL1.CONFIRM_DATE) OVER (PARTITION BY D0AL2.ACCOUNT_NBR
                    ORDER BY D0AL1.ASSIGNMENT_DATE ROWS BETWEEN 7 PRECEDING AND 7 PRECEDING) AS repo_date1
            , MIN(D0AL1.CONFIRM_DATE) OVER (PARTITION BY D0AL2.ACCOUNT_NBR
                    ORDER BY D0AL1.ASSIGNMENT_DATE ROWS BETWEEN 6 PRECEDING AND 6 PRECEDING) AS repo_date2
            , MIN(D0AL1.CONFIRM_DATE) OVER (PARTITION BY D0AL2.ACCOUNT_NBR
                    ORDER BY D0AL1.ASSIGNMENT_DATE ROWS BETWEEN 5 PRECEDING AND 5 PRECEDING) AS repo_date3

1 Ответ

0 голосов
/ 06 ноября 2018

Из документации :

Аналитические функции вычисляют совокупное значение на основе группы строк. Они отличаются от агрегатных функций тем, что возвращают несколько строк для каждой группы. Группа строк называется окном ...

и

ROWS | RANGE

Эти ключевые слова определяют для каждой строки окно (физический или логический набор строк), используемое для вычисления результата функции. Затем функция применяется ко всем строкам в окне. Окно перемещается по результирующему набору результатов или разделу сверху вниз.

  • ROWS определяет окно в физических единицах (строках).

  • RANGE определяет окно как логическое смещение.

...

value_expr PRECEDING или value_expr FOLLOWING

Для RANGE or ROW`:

  • Если value_expr FOLLOWING является начальной точкой, тогда конечная точка должна быть value_expr FOLLOWING.

  • Если value_expr PRECEDING является конечной точкой, тогда начальная точка должна быть value_expr PRECEDING.

В каждом из ваших предложений используется один и тот же value_expr как для предыдущего, так и для следующего, поэтому окно ограничено ровно 1 строкой; оглядываясь назад, 7 рядов для первого, 6 рядов для второго и т. д.

Как демонстрация того, что это генерирует:

with t (id, dt) as (
  select level, date '2018-01-01' + (level * 3)
  from dual
  connect by level <= 10
)
select id, dt,
  min(id) over (order by dt rows between 7 preceding and 7 preceding) as a,
  min(id) over (order by dt rows between 6 preceding and 6 preceding) as b,
  min(id) over (order by dt rows between 5 preceding and 5 preceding) as c
from t
order by dt;

        ID DT                  A          B          C
---------- ---------- ---------- ---------- ----------
         1 2018-01-04                                 
         2 2018-01-07                                 
         3 2018-01-10                                 
         4 2018-01-13                                 
         5 2018-01-16                                 
         6 2018-01-19                                1
         7 2018-01-22                     1          2
         8 2018-01-25          1          2          3
         9 2018-01-28          2          3          4
        10 2018-01-31          3          4          5

Сгенерированные столбцы a, b и c оглядываются назад на 7, 6 и 5 строк соответственно, чтобы найти значение для использования. Если нет подходящей строки в далеком прошлом, результат будет нулевым.


Также обратите внимание, что аналитическое предложение упорядочено по значению даты, и эти даты не являются смежными - но возвращаются идентификаторы. Это потому, что он смотрит на строки в этом порядке, а не на реальные значения, которые они содержат. Если вы использовали вместо этого окно диапазона:

select id, dt,
  min(id) over (order by dt range between 7 preceding and 7 preceding) as a,
  min(id) over (order by dt range between 6 preceding and 6 preceding) as b,
  min(id) over (order by dt range between 5 preceding and 5 preceding) as c
from t
order by dt;

        ID DT                  A          B          C
---------- ---------- ---------- ---------- ----------
         1 2018-01-04                                 
         2 2018-01-07                                 
         3 2018-01-10                     1           
         4 2018-01-13                     2           
         5 2018-01-16                     3           
         6 2018-01-19                     4           
         7 2018-01-22                     5           
         8 2018-01-25                     6           
         9 2018-01-28                     7           
        10 2018-01-31                     8           

... результаты будут сильно отличаться, и вы увидите только идентификаторы с датой значения 5, 6 и 7 дней назад - и, как я сделал все пропуски 3 дня в CTE , есть только совпадения в столбце результата b. Ни у одного из рядов нет ничего за 5 или 7 дней до этого, у них есть только ряды за 6 дней до этого (как мультипель из 3), и первые несколько рядов до сих пор не имеют совпадений в далеком прошлом. Если вы продлили это до 3-х дней до этого, вы увидите совпадения и для них.

...