组合SQL中连续行的特定列的值

时间:2014-04-23 23:47:11

标签: sql sql-server

我将日志导出到SQL。问题是如果日志API的长度超过800个字符,那么日志记录API将修剪Message列,并使用其余的消息创建新条目。我使用logparser将这些数据直接导出到SQL中。因此,对于剩下的讨论,让我们假设我必须在SQL中解决这个问题。

这就是SQL表的样子

ID    Timestamp    EventID   Message 
1     2014-04-23    abcd   "Some message"    

如果Message中的字符数超过800,我们会在表中有一个新行,其中Message以“...”开头。原始行将以“...”结尾,表示还有更多内容来。

例如

ID     Timestamp    EventID   Message 
1       2014-04-23    abcd   "Some message..."
2       2014-04-23    abcd   "...More message..."
3       2014-04-23    abcd   "...Even More message"    

请注意,属于一起的消息的ID是连续的。没有其他保证。保证时间戳对于拆分是相同的但不是不同的意味着表中的其他条目可以具有相同的时间戳。同样适用于eventID

问题
鉴于表中的这些数据,我想创建一个视图,将这些消息拼接成一个统一的消息。因此,用户永远不必知道幕后发生的修剪。

结果应如下所示

ID    Timestamp    EventID   Message 
1     2014-04-23    abcd   "Some message More message even more message"

2 个答案:

答案 0 :(得分:2)

首先检查表格中“消息”列的列长度。

在我看来,你可以通过两个选项中的任何一个来实现这一目标。

选项1: 每天运行一个sql脚本,通过将“消息”列中的所有消息组合成某个时间戳&事件ID。

(我假设SQL Server,但我确信在其他RDBMS中有相同的东西)

select Timestamp,EventID,
  CombinedMessage((SELECT Message + ' '
       FROM table t2
       where t2.Timestamp = t1.Timestamp
           and t2.EventID = t1.EventID
       FOR XML PATH('')),1,1,'') 
from table t1
into [NewTable]
group by Timestamp,EventIDenter code here

是的,我建议创建一个包含所需数据的新表。 可以使用Windows shell脚本或批处理脚本(取决于您的环境)调用此sql脚本,然后可以使用Windows Scheduler对其进行调度。

选项2: 在我的工作场所,我在C#中编写了一个应用程序,它将使用日志解析器每晚将Web日志加载到数据库表中,然后对导入到表中的数据执行项目特定的后处理。所以类似地,在将数据导入表格后,您可以创建一个简单的控制台应用程序,它可以执行以下操作:

使用以下查询创建数据集

SELECT t.Timestamp, t.EventID, t.Message, 
     ROW_NUMBER() OVER(PARTITION BY t.EventID ORDER BY t.Timestamp) rownumber
FROM theTable t

现在在你的应用中,

For Each rowNumber in  [data set]
{
  1. concatenate Message
  2. Insert into your original table the combined message record
  3. Calculate the MAX(LEN(Message)) and delete all other entries 
     whose message is less than MAX(LEN(Message)).
     You are now left with only one entry for a certain Timestamp, EventID & Message
}

希望以上提供的信息有所帮助。

答案 1 :(得分:0)

测试数据

DECLARE @TABLE TABLE(ID INT,[Timestamp] DATE,EventID VARCHAR(20),[Message] VARCHAR(800))
INSERT INTO @TABLE VALUES 
(1,       '2014-04-23',    'abcd',   'Some message...'),
(2,       '2014-04-23',    'abcd',   '...More message...'),
(3,       '2014-04-23',    'abcd',   '...Even More message'),
(1,       '2014-04-23',    'abcE',   'Some other message...'),
(2,       '2014-04-23',    'abcE',   '...other More message...'),
(3,       '2014-04-23',    'abcE',   '...other Even More message')

<强>查询

SELECT t.EventID
      ,t.[Timestamp]
      ,REPLACE(STUFF((
            SELECT '  ' + [Message] 
            FROM @TABLE
            WHERE EventID = t.EventID
            ORDER BY ID ASC
            FOR XML PATH(''),TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,''), '...', '') AS [Message]

FROM @TABLE t
GROUP BY t.EventID ,t.[Timestamp]

结果集

╔═════════╦════════════╦══════════════════════════════════════════════════════════════╗
║ EventID ║ Timestamp  ║                           Message                            ║
╠═════════╬════════════╬══════════════════════════════════════════════════════════════╣
║ abcd    ║ 2014-04-23 ║ Some message More message Even More message                  ║
║ abcE    ║ 2014-04-23 ║ Some other message other More message other Even More message║
╚═════════╩════════════╩══════════════════════════════════════════════════════════════╝