Как сгруппировать по частичным данным в поле выражение SQL
К примеру у меня есть таблица table, в котором есть поле detail, вмещает примерно следующее
CF=инфа информация;FG=данные группировки 1;DF=еще что-то;
CF=инфа информация;FG=данные группировки 2;DF=еще что-то;
CF=инфа информация;FG=данные группировки 1;DF=еще что-то;
И мне нужно сгруппировать по данные группировки 1, данные группировки 2, ...
Как это сделать, и что можно почитать?
Ответы (2 шт):
В выражении 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
А почитать необходимо про строковые функции.