Skip to content

Instantly share code, notes, and snippets.

@aykononov
Last active April 7, 2020 13:16
Show Gist options
  • Save aykononov/8ca2f79325e77a1b6bc853a4d48468af to your computer and use it in GitHub Desktop.
Save aykononov/8ca2f79325e77a1b6bc853a4d48468af to your computer and use it in GitHub Desktop.
Аналитические функции (8)
/* Аналитические функции (8)
Создать таблицу из произвольного количества >1000 строк с четырьмя полями: номер строки и четыре разных целых псевдослучайных числа в интервале от 1 до 100.
Вывести запросом:
- для первой строки – номер, первое число, второе число из следующей строки, третье число из следующей строки
- для последней строки – номер, первое число, второе число из предыдущей строки, третье число из предыдущей строки
- если первое число четное – номер, первое число, второе число из предыдущей строки, третье число из следующей строки
- если первое число нечетное – номер, первое число, второе число из следующей строки, третье число из предыдущей строки
*/
-- Создаем тестовые данные
CREATE TABLE tabnum (ID NUMBER GENERATED ALWAYS AS IDENTITY, num1 NUMBER, num2 NUMBER, num3 NUMBER, num4 NUMBER );
BEGIN
FOR i IN 1..1100 LOOP
INSERT INTO tabnum (num1,num2,num3,num4)
SELECT TRUNC (dbms_random.value(1,100))
,TRUNC (dbms_random.value(1,100))
,TRUNC (dbms_random.value(1,100))
,TRUNC (dbms_random.value(1,100))
FROM dual;
END LOOP;
END;
-- Запрос
SELECT *
FROM ( SELECT t.id
,t.num1 AS t_num1
,LEAD(t.num2) OVER(ORDER BY t.id) AS t_num2
,LEAD(t.num3) OVER(ORDER BY t.id) AS t_num3
FROM tabnum t
ORDER BY t.id FETCH FIRST 1 ROWS ONLY )
UNION
SELECT *
FROM (SELECT t.id
,t.num1 AS t_num1
,DECODE(MOD(t.num1,2),0,LAG(t.num2) OVER(ORDER BY t.id),LEAD(t.num2) OVER(ORDER BY t.id)) AS t_num2
,DECODE(MOD(t.num1,2),0,LEAD(t.num3) OVER(ORDER BY t.id),LAG (t.num3) OVER(ORDER BY t.id)) AS t_num3
FROM tabnum t
ORDER BY t.id OFFSET 1 ROWS FETCH NEXT (SELECT t.id
FROM tabnum t
ORDER BY t.id DESC FETCH FIRST 1 ROWS ONLY)-2 ROWS ONLY)
UNION
SELECT *
FROM (SELECT t.id
,t.num1 AS t_num1
,LAG(t.num2) OVER(ORDER BY t.id) AS t_num2
,LAG(t.num3) OVER(ORDER BY t.id) AS t_num3
FROM tabnum t
ORDER BY t.id DESC FETCH FIRST 1 ROWS ONLY);
@aykononov
Copy link
Author

Создать таблицу из произвольного количества >1000 строк с четырьмя полями: номер строки и четыре разных целых псевдослучайных числа в интервале от 1 до 100.
Вывести запросом:
- для первой строки – номер, первое число, второе число из следующей строки, третье число из следующей строки
- для последней строки – номер, первое число, второе число из предыдущей строки, третье число из предыдущей строки
- если первое число четное – номер, первое число,  второе число из предыдущей строки, третье число из следующей строки
- если первое число нечетное – номер, первое число,  второе число из следующей строки, третье число из предыдущей строки

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment