2013-07-23 25 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%',並且基於ID和Time_Stamp之後的每一行都包含字符串。某些ID在activity_log中將不具有該語言,並且組列對於所有行都將爲NULL。對於那些做的,我希望在activity_log開始時LIKE'%轉移到組x%',並在activity_log類似於'%轉移到組x%'或'%ticket was resolved%'時結束。我試圖用OVER(partition by)編寫一個查詢來區分ID,但我沒有成功。

謝謝

+2

那麼......計算列?另外,哪個DBMS是這樣的? [tag:sql]有點太模棱兩可了。附:根據表的大小,您可能只需添加一個普通列,通過一次運行解析器,然後使用觸發器來保持新列同步。計算/計算的列在增加的開銷方面可能非常密集。 –

+1

應該編寫這個「組」列是應用程序代碼而不是數據庫的責任?看起來應用程序代碼具有正確設置所需的所有信息。 –

回答

2

您可以使用「累計最大值」功能做到這一點。這是由支持窗口函數大多數數據庫之前,SQL Server 2012的

這裏的支持,與SQL Server的例外是方法:

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)