Намиране на пропуски в последователността в таблица в Oracle
ПроблемИскате да намерите всички пропуски в последователността от числа или в датите и часовете във вашите данни. Пропуските биха могли
да бъдат в дати, записани за дадено действие, или в някои други данни с логически последователен характер.
Решение
Функциите на Oracle LAG и LEAD OLAP ви позволяват да сравните текущия ред с резултати с предходен ред.
Общият формат на LAG изглежда така
Lag (колона или израз, изместване на предходния ред, по подразбиране за първия ред)
Колоната или изразът е стойността, която трябва да се сравнява с изоставащи (предхождащи) стойности. Предходното
отместване на ред показва колко реда преди текущия ред трябва да действа LAG. Използвахме „1“ в
следния списък, за да означава ред един преди текущия ред. По подразбиране за LAG указва каква
стойност да се използва като прецедент за първия ред, тъй като в таблица или резултат няма ред нула. Инструктираме Oracle
да използва 0 като стойност на котва по подразбиране, за да се справи със случая, в който търсим деня преди първия от
месеца.
Може да се използва подходът WITH псевдоним на заявка в почти всички ситуации, когато се използва подзаявка, за
преместване на детайлите на подзаявката преди основната заявка. Това подпомага четимостта и преструктурирането на кода, ако
е необходимо на по-късна дата.
Тази рецепта търси пропуски в последователността от дни, в които са направени поръчките за месец
ноември 1999 г.:
с дни за продажба като
(изберете извлечение(ден от датата_на_поръчка) следваща_продажба,
закъснение(извлечение(ден от датата_на_поръчка),1,0)
над (поръчка по извлечение(ден от датата_на_поръчка)) prev_sale
от oe.orders
където поръчка_дата между '01-NOV-1999' и '30-NOV-1999')
изберете предишна_разпродажба, следваща_разпродажба
от разпродажба
където next_sale - prev_sale> 1
order by prev_sale;
Нашата заявка разкрива пропуските в дни между продажбите за месец ноември 1999 г.
ПРЕДИШНА_РАЗПРОДАЖБА СЛЕДВАЩА_ПРОДАЖБА
--------- ----------
1 10
10 14
15 19
20 22
Резултатите показват, че след записване на поръчка на първо число на месеца, последваща поръчка
не е записана до 10-то число. След това последва четиридневна разлика до 14-ти и т.н. Един проницателен мениджър по продажбите
може да използва тези данни, за да попита какво е правил екипът по продажбите в тези празни дни и защо не са постъпили поръчки
!