Как сгруппировать по частичным данным в поле выражение SQL

К примеру у меня есть таблица table, в котором есть поле detail, вмещает примерно следующее

CF=инфа информация;FG=данные группировки 1;DF=еще что-то;

CF=инфа информация;FG=данные группировки 2;DF=еще что-то;

CF=инфа информация;FG=данные группировки 1;DF=еще что-то;

И мне нужно сгруппировать по данные группировки 1, данные группировки 2, ...

Как это сделать, и что можно почитать?


Ответы (2 шт):

Автор решения: Alex R.

В выражении Group by можно указывать как сами поля, так и их преобразованные с помощью функций значения. В обоих случаях только эти выражения можно использовать в самой выборке

Сама регулярка такая FG=([^;]+) (пример) при использовании необходимо указывать, что надо выбрать именно первую группу, т.е текст в скобках, c синтаксисом Oracle запрос будет выглядеть так

  select
    FG, <групповая функция по any_field> 
  from (select
          t.any_field, 
          REGEXP_SUBSTR(t.detail, 'FG=([^;]+)', 1, 1, '', 1) fg
        from table t)
  group by fg

Групповые функции работают на наборах строк с одинаковыми значениями в полях, которые определяется в group by и выдают один результат на такую группу. К групповым функций относятся AVG, MIN, MAX и т.д.

Ключевые слова для поиска это Групповые функции, GROUP BY.

Небольшая вводная по регулярным выражениям есть в описании самой метки.

Пример статей ссылка, ссылка, ссылка

→ Ссылка
Автор решения: Виктор Миклуха

Если необходимо получить только часть строки detail между метками ';FG=' и ';DF=', то в T-SQL это выглядит так:

SELECT SUBSTRING(detail, PATINDEX('%;FG=%', detail)+4, PATINDEX('%;DF=%', detail)-PATINDEX('%;FG=%', detail)-4)
FROM table
GROUP BY SUBSTRING(detail, PATINDEX('%;FG=%', detail)+4, PATINDEX('%;DF=%', detail)-PATINDEX('%;FG=%', detail)-4)

Результатом выполнения запроса для приведённого примера будут две строки:

данные группировки 1
данные группировки 2

А почитать необходимо про строковые функции.

→ Ссылка