Last active
April 7, 2020 13:16
-
-
Save aykononov/8ca2f79325e77a1b6bc853a4d48468af to your computer and use it in GitHub Desktop.
Аналитические функции (8)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Аналитические функции (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); |
Author
aykononov
commented
Nov 14, 2019
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment