Запрос Oracle для отображения количества и начала, конца последовательности - PullRequest
0 голосов
/ 11 мая 2018

Я знаю основы Oracle и я являюсь разработчиком Java, я могу выполнить следующую операцию / задачу в Java, извлекая данные и перебирая их. Но я хотел бы знать, есть ли способ показать начало и конец последовательности, а также разницу между началом и концом с использованием SQL (Oracle) запроса.

Допустим, у меня есть таблица TB1 со столбцом seq, который содержит несколько последовательных чисел

 SEQ
------
1
2
3
7
8
9
14
19
20

Есть ли способ отобразить начало, конец и счет последовательности следующим образом.

Start  | end | count
---------------------
1        3     3
7        9     3
14       14    1
19       20    2   

Пожалуйста, дайте мне указатель, достижимо это или нет. Заранее спасибо.

Ответы [ 3 ]

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

Да. Вы можете сделать это легко, используя метод TABIBITOSAN .

SELECT MIN(seq)
    ,MAX(seq)
    ,count(*)
FROM (
    SELECT seq
        ,seq - row_number() OVER (
            ORDER BY seq
            ) grp
    FROM t
    )
GROUP BY grp
ORDER BY 1;

Демо

0 голосов
/ 11 мая 2018
SQL> WITH cte_table (seq) AS (
  2    SELECT 1 FROM dual UNION ALL
  3    SELECT 2 FROM dual UNION ALL
  4    SELECT 3 FROM dual UNION ALL
  5    SELECT 7 FROM dual UNION ALL
  6    SELECT 8 FROM dual UNION ALL
  7    SELECT 9 FROM dual UNION ALL
  8    SELECT 14 FROM dual UNION ALL
  9    SELECT 19 FROM dual UNION ALL
 10    SELECT 20 FROM dual),
 11  table_ AS (
 12  SELECT seq, seq - row_number() OVER (ORDER BY seq) grp FROM cte_table)
 13  SELECT MIN(seq) "START",
 14         MAX(seq) "END",
 15         COUNT(*) "COUNT"
 16    FROM table_
 17   GROUP BY grp
 18   ORDER BY 1;

Выход:

     START        END      COUNT
---------- ---------- ----------
         1          3          3
         7          9          3
        14         14          1
        19         20          2

Используя вашу таблицу, запрос будет

WITH table_ AS (
  SELECT seq, seq - row_number() OVER (ORDER BY seq) grp FROM tb1) 
SELECT MIN(seq) "START",
       MAX(seq) "END",
       COUNT(*) "COUNT"
  FROM table_
 GROUP BY grp
 ORDER BY 1;
0 голосов
/ 11 мая 2018

Вы должны написать процедуру и пройти через курсор.Сохраните три временные переменные везде, где есть разрыв в seq (убедитесь, что вы выполняете Order by в столбце Seq), и вставьте начало, конец и счет в другую таблицу.

См. пример это может быть полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...