Как найти самую длинную подстроку в оракуле между рядами? - PullRequest
0 голосов
/ 26 сентября 2018

В моей базе данных оракула я хочу найти самую длинную общую подстроку.Пример:

\roomname\nameid\department\foledertest\foldername\a.txt
\roomname\nameid\department\foledertest\foldername\forlder1\a.txt
\roomname\nameid\department\foledertest\foldername\forlder1\folder2\a.txt

Итак, я хочу получить результат:

\roomname\nameid\department\foledertest\foldername\

У кого-нибудь есть идеи, помогите мне, спасибо?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы можете использовать функцию stats_mode , которая принимает в качестве аргумента набор значений и возвращает значение, которое встречается с наибольшей частотой:

select stats_mode(field_name) 
  from table_name

возвращает

\roomname\nameid\department\foledertest\foldername\a.txt

Тогда, в этом случае, вы можете использовать что-то вроде функции подстроки, чтобы перехватить только путь:

select substr(common, 1, instr(common, '\', -1))
  from (select stats_mode(field_name) as common 
          from table_name);
0 голосов
/ 26 сентября 2018

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE files ( name ) AS
SELECT '\roomname\nameid\department\foledertest\foldername\a.txt' FROM DUAL UNION ALL
SELECT '\roomname\nameid\department\foledertest\foldername\forlder1\a.txt' FROM DUAL UNION ALL
SELECT '\roomname\nameid\department\foledertest\foldername\forlder1\folder2\a.txt' FROM DUAL;

Запрос 1 :

WITH names ( name ) AS (
  SELECT SUBSTR( name, 1, MIN( LENGTH( name ) ) OVER () )
  FROM   files
),
substrs ( common, num_matches ) AS (
  SELECT name,
         COUNT( DISTINCT name ) OVER ()     
  FROM   names
UNION ALL
  SELECT SUBSTR( common, 1, LENGTH( common ) - 1 ),
         COUNT( DISTINCT SUBSTR( common, 1, LENGTH( common ) - 1 )  ) OVER ()     
  FROM   substrs
  WHERE  num_matches > 1
  AND    LENGTH( common ) > 1
)
SELECT common
FROM   substrs
WHERE  num_matches = 1
AND    ROWNUM = 1

Результаты :

|                                              COMMON |
|-----------------------------------------------------|
| \roomname\nameid\department\foledertest\foldername\ |

Обновление - если вы хотите ограничить его до завершенияпапки просто обрезают вывод до последнего \ символа:

SQL Fiddle

Oracle 11g R2 Schema Setup :

CREATE TABLE files ( name ) AS
SELECT '\roomname\nameid\department\foledertest\foldername\a.txt' FROM DUAL UNION ALL
SELECT '\roomname\nameid\department\foledertest\foldername\forlder1\a.txt' FROM DUAL UNION ALL
SELECT '\roomname\nameid\department\foledertest\foldername\forlder1\folder2\a.txt' FROM DUAL UNION ALL
SELECT '\roomname\nameid\department\foledertest\foldername_1\a.txt' FROM DUAL;

Запрос 1 :

WITH names ( name ) AS (
  SELECT SUBSTR( name, 1, MIN( LENGTH( name ) ) OVER () )
  FROM   files
),
substrs ( common, num_matches ) AS (
  SELECT name,
         COUNT( DISTINCT name ) OVER ()     
  FROM   names
UNION ALL
  SELECT SUBSTR( common, 1, LENGTH( common ) - 1 ),
         COUNT( DISTINCT SUBSTR( common, 1, LENGTH( common ) - 1 )  ) OVER ()     
  FROM   substrs
  WHERE  num_matches > 1
  AND    LENGTH( common ) > 1
)
SELECT SUBSTR( common, 1, INSTR( common, '\', -1 ) ) AS common
FROM   substrs
WHERE  num_matches = 1
AND    ROWNUM = 1

Результаты :

|                                   COMMON |
|------------------------------------------|
| \roomname\nameid\department\foledertest\ |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...