我想在其他列所需条件的基础上为排名列插入值

时间:2018-12-14 06:30:20

标签: sql sql-server tsql

declare @count int = 0

while (@count != 3156)
begin
    while(ErrorCode not like 'm%')
    begin
        insert into #temp(Ranks) 
        values(@count)  
    end

    set @count = @count + 1
end

我有一个包含3列ErrorCodeErrorCountRanks的临时表,并且无论何时{{1}的初始值,我都必须在Ranks列中插入相同的值}重复。我现在在ErrorCode列中为NULL:

Ranks

我想要为ErrorCode ErrorCount Ranks ---------------------------------------------------- module_position A1_16__1 1 head_id HZ0C1 000877 1 start_dt 2018-09-10 00:18:27 1 module_position A2_16__1 2 head_id HZ0C1 000878 2 start_dt 2018-09-10 00:18:27 2 列按上述输出。请注意,每当我要插入新排名时,初始值始终为Ranks

2 个答案:

答案 0 :(得分:1)

尝试一下:

DECLARE @DataSource TABLE
(
    [RowID] INT
   ,[ErrorCode] VARCHAR(32)
   ,[ErrorCount] VARCHAR(32)
);

INSERT INTO @DataSource ([RowID], [ErrorCode], [ErrorCount])
VALUES (1, 'module_position', 'A1_16__1')
      ,(2, 'head_id HZ0C1', '   000877')
      ,(3, 'start_dt', ' 2018-09-10 00:18:27')
      ,(4, 'module_position', 'A2_16__1')
      ,(5, 'head_id HZ0C1', '   000878')
      ,(6, 'start_dt', ' 2018-09-10 00:18:27')

SELECT [ErrorCode]
      ,[ErrorCount]
      ,SUM(IIF([ErrorCode] = 'module_position', 1, 0)) OVER (ORDER BY [RowID])
FROM @DataSource;

请注意,您可以通过某种方式正确地对行进行排序。您不能假设没有指定唯一的订购条件就从表中读取它们总是会得到相同的结果。

在上面的示例中,我使用了RowID列。例如,如果有创建日期,则可以按其排序。

如果不对行进行排序,则可以以一个错误的head_id结尾并与另一个错误分组。

答案 1 :(得分:0)

您可以尝试以下查询。

CREATE TABLE #TempErrorCode
(   id int identity(1,1) not null,
   [ErrorCode] VARCHAR(50)
   ,[ErrorCount] VARCHAR(50)
);

INSERT INTO #TempErrorCode ([ErrorCode], [ErrorCount])
VALUES ('module_position', 'A1_16__1')
      ,('head_id HZ0C1', '   000877')
      ,('start_dt', ' 2018-09-10 00:18:27')
      ,('module_position', 'A2_16__1')
      ,('head_id HZ0C1', '   000878')
      ,('start_dt', ' 2018-09-10 00:18:27')

ALTER TABLE #TempErrorCode ADD RankVal INT

SELECT * INTO #TempRank FROM(  
SELECT *, ROW_NUMBER () OVER (PARTITION BY ErrorCode ORDER BY ErrorCode desc) as NewRank FROM #TempErrorCode
)a

--SELECT * FROM #TempRank

UPDATE A    
  SET RankVal = RA.NewRank   
from #TempErrorCode A
  INNER JOIN #TempRank RA
    ON A.ErrorCode = RA.ErrorCode and A.Id = RA.Id

SELECT * FROM #TempErrorCode order by RankVal

输出如下所示

id  ErrorCode         ErrorCount               RankVal
1   module_position   A1_16__1                   1
2   head_id HZ0C1     000877                     1
3   start_dt          2018-09-10 00:18:27        1
4   module_position   A2_16__1                   2
5   head_id HZ0C1     000878                     2
6   start_dt          2018-09-10 00:18:27        2

Live Demo <> Rank Update