1

我一直无法找到类似这种情况的 SQL Server 问题。我有以下格式的数据。

Recnum    SectionID    CategoryID    EnterTime     LeaveTime
534       2            4             <time here>   <time here>   
535       2            2             <time here>   <time here>  
532       2            2             <time here>   <time here>  
523       2            4             <time here>   <time here>  
512       2            4             <time here>   <time here>  
577       2            NULL          <time here>   <time here>  
578       1            6             <time here>   <time here>  
579       2            2             <time here>   <time here>   
571       2            2             <time here>   <time here>    
588       2            2             <time here>   <time here>  

我需要添加一个 GroupID 列,以便数据如下所示。

Recnum    SectionID    CategoryID    EnterTime     LeaveTime    GroupID
534       2            4             <time here>   <time here>  NULL 
535       2            2             <time here>   <time here>  1
532       2            2             <time here>   <time here>  1
523       2            4             <time here>   <time here>  NULL
512       2            4             <time here>   <time here>  NULL
577       2            NULL          <time here>   <time here>  2
578       1            6             <time here>   <time here>  NULL
579       2            2             <time here>   <time here>  3  
571       2            2             <time here>   <time here>  3
588       2            2             <time here>   <time here>  3

GroupID 用于 SectionID 和 CategoryID 均为 2 或 SectionID 为 2 且 CategoryID 为 NULL 的情况。当按 EnterTime 排序的行中有多个这些模式时,GroupID 必须相同,并且必须为下一组组递增。Recnum 是 PK,但不是按 EnterTime 顺序排列的。我可以在 WHILE 循环中执行此操作,但该表包含超过 3500 万条记录,因此可能需要几天的时间来处理。关于如何做到这一点的任何想法?

Example of the times for two rows:
Enter                     Leave
2011-05-31 21:04:07.000   2011-05-31 21:04:35.000
2011-05-31 21:04:35.000   2011-05-31 21:04:44.000
4

2 回答 2

0

创建在您的场景中返回 GroupId 的 SQL 函数,然后使用此函数更新表

UPDATE TABLE SET GroupId=DBO.YOURFUNCTION(SectionID,CategoryID)

您的函数示例在这里

CREATE FUNCTION GROUPIDFINDER ( @SectionID INT, @CategoryID INT ) RETURNS int AS BEGIN DECLARE @Result int

IF @SectionID=2 AND @CategoryID=2
BEGIN
SET @Result=1
END
-- Return the result of the function
RETURN @Result

END GO

于 2012-10-04T15:18:05.277 回答
-1

如果您不受限制在 sql server 中执行此操作,则最好的选择是

  1. 将数据导出到文本文件
  2. 用您喜欢的语言编写一个程序来处理该文本文件(我建议只导出 recnum 和新的 groupid,并且只导出那些 groupid 不为空的)
    • 即使超过 3500 万行,这也只需要几分钟
  3. 使用批量插入将数据带回 sql server
    • 再过几分钟
  4. 使用 UPDATE ... FROM 语句将批量插入的表连接回原始表以更新 groupid 列

    UPDATE o 
    SET GroupID = bi.GroupID
    FROM OriginalTable o 
        INNER JOIN BulkInsertTable bi 
        ON o.RecNum = bi.RecNum
    
    • 这将花费更长的时间,但是由于花费的时间是将数据写入磁盘的时间,因此这是不可避免的
于 2012-10-04T15:08:30.027 回答