2013-07-23 9 views
1

Добрый день всем. Я не смог найти решение и искал какую-либо помощь. У меня есть таблица, для которой я хотел бы добавить столбец:SQL - Как добавить столбец на основе нескольких столбцов в таблице

ID  Time_Stamp      Activity_Log 
1254 6/1/2013 8:00:00AM   'Ticket was opened by user A' 
1254 6/2/2013 8:20:00AM   'Comment was logged by user B' 
1254 6/4/2013 8:25:00AM   '**Ticket was transferred to Group 1**' 
1254 6/7/2013 8:50:00AM   'Comment was logged by user B' 
1254 6/11/2013 10:00:00AM  'Comment was logged by user C' 
1254 6/12/2013 12:00:00PM  '**Ticket was transferred to Group 2**' 
7589 6/3/2013 11:00:00PM  'Ticket was opened by user A' 
7589 6/5/2013 1:00:00PM   'Comment was logged by user C' 
7589 6/7/2013 2:00:00PM   'Resolution provided by user C' 
7589 6/11/2013 5:00:00PM  'Ticket resolved by user C' 
8526 6/3/2013 7:00:00PM  'Ticket opened by user D' 
8526 6/4/2013 2:00:00PM  '**Ticket was transferred to Group 2**' 
8526 6/5/2013 1:00:00PM  'Comment was logged by user G' 
8526 6/8/2013 5:00:00PM  '**Ticket was resolved by user C**' 

Вот что я хотел бы новую колонку, группу, чтобы выглядеть следующим образом:

ID  Time_Stamp      Activity_Log       Group 
1254 6/1/2013 8:00:00AM   'Ticket was opened by user A'    NULL 
1254 6/2/2013 8:20:00AM   'Comment was logged by user B'    NULL 
1254 6/4/2013 8:25:00AM   '**Ticket was transferred to Group 1**'  Group 1 
1254 6/7/2013 8:50:00AM   'Comment was logged by user B'    Group 1 
1254 6/11/2013 10:00:00AM  'Comment was logged by user C'    Group 1 
1254 6/12/2013 12:00:00PM  '**Ticket was transferred to Group 2**'  Group 2 
7589 6/3/2013 11:00:00PM  'Ticket was opened by user A'    NULL 
7589 6/5/2013 1:00:00PM   'Comment was logged by user C'    NULL 
7589 6/7/2013 2:00:00PM   'Resolution provided by user C'    NULL 
7589 6/11/2013 5:00:00PM  'Ticket resolved by user C'     NULL 
8526 6/3/2013 7:00:00PM  'Ticket opened by user D'      NULL 
8526 6/4/2013 2:00:00PM  '**Ticket was transferred to Group 2**'  Group 2 
8526 6/5/2013 1:00:00PM  'Comment was logged by user G'    Group 2 
8526 6/8/2013 5:00:00PM  '**Ticket was resolved by user C**'   Group 2 

Я хотел бы добавить это групповой столбец со строкой, если Activity_Log LIKE '% xx%', а для каждой строки - на основе идентификатора и Time_Stamp. Некоторые идентификаторы не будут содержать язык в журнале activity_log, а столбец Group будет NULL для всех строк. Для тех, кто это делает, я хотел бы начать, когда activity_log LIKE '% переходит в Group x%' и заканчивается, когда Activity_log либо похож на «% Transfer to Group x%», либо «% ticket был разрешен%». Я попытался написать запрос, используя OVER (раздел by), чтобы отключить идентификатор, но я не был успешным.

Благодаря

+2

Итак ... рассчитанная колонка? Кроме того, какие dbms это? [tag: sql] немного слишком неоднозначен. постскриптум в зависимости от размера таблицы, вы можете просто добавить обычный столбец, запустить синтаксический анализатор через него в одноразовом режиме, а затем использовать триггер, чтобы синхронизировать новый столбец. Вычисленный/рассчитанный столбец может быть очень интенсивным с точки зрения добавленных служебных данных. –

+1

Должен ли писать этот столбец «группа» в качестве кода приложения, а не базы данных? Кажется, что в коде приложения есть вся информация, необходимая для правильной установки. –

ответ

2

Вы можете сделать это с помощью функции «кумулятивный макс». Это поддерживается большинством баз данных, которые поддерживают оконные функции, за исключением SQL Server до SQL Server 2012.

Вот подход:

select t.id, t.Time_Stamp, t.Activity_Log, 
     MAX(GroupName) over (partition by id order by TimeStamp) as "Group"  
from (select t.*, 
      (case when Activity_Log like '%transferred to Group%' 
        then left(RIGHT(Activity_Log, 9), 7) 
       end) as GroupName 
     from t 
    ) t; 

Если вы действительно хотите добавить это как столбец, вам нужно изменить таблицу, чтобы добавить столбец, а затем использовать оператор update.

Если база данных не поддерживает накопленную сумму, вы можете сделать работу с коррелированными подзапросами:

select t.id, t.Time_Stamp, t.Activity_Log, 
     (select left(RIGHT(t2.Activity_Log, 9), 7) 
     from t t2 
     where t2.id = t.id and 
       t2.TimeStamp <= t.TimeStamp and 
       Activity_Log like '%transferred to Group%' 
     order by t2.TimeStamp desc 
     limit 1 
     ) as "Group" 
from t; 
0

Я бы с Gordon Linoff's решения, но вы можете добавить столбец, который нужен с ALTER TABLE, если вы хотите сохранить его, если вы хотите отобразить только информацию, тогда также будет SELECT.

ALTER TABLE tblLog 
ADD Group VARCHAR(4) 
Смежные вопросы