代码之家  ›  专栏  ›  技术社区  ›  Floriana

在块中指定递增值

  •  -1
  • Floriana  · 技术社区  · 7 年前

    我有一张具有以下特征的桌子: RecordId-唯一标识符 日期、重量和对照(如果重量大于10000,则为1)。

    RecordID    Date    Weight  Control
    1           16/07/2014  12200   1
    2           16/07/2014  0       0
    3           16/07/2014  5720    0
    4           16/07/2014  11060   1
    5           16/07/2014  15940   1
    6           16/07/2014  16200   1
    7           16/07/2014  16080   1
    8           16/07/2014  16080   1
    9           16/07/2014  16080   1
    10          18/07/2014  16080   1
    11          18/07/2014  3720    0
    12          18/07/2014  4500    0
    13          18/07/2014  23800   1
    14          18/07/2014  40700   1
    15          18/07/2014  40700   1
    

    我想添加一个新列(组),为0和1的每组分配相同的递增数,如下所示:

    RecordID    Date    Weight  Control Group
    1            16/07/2014 12200   1   1
    2            16/07/2014 0       0   2
    3            16/07/2014 5720    0   2
    4            16/07/2014 11060   1   3
    5            16/07/2014 15940   1   3
    6            16/07/2014 16200   1   3
    7            16/07/2014 16080   1   3
    8            16/07/2014 16080   1   3
    9            16/07/2014 16080   1   3
    10           18/07/2014 16080   1   3
    11           18/07/2014 3720    0   4
    12           18/07/2014 4500    0   4
    13           18/07/2014 23800   1   5
    14           18/07/2014 40700   1   5
    15           18/07/2014 40700   1   5
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   steswinbank    7 年前

    我假设您正在使用Microsoft Transact-SQL。

    这里有一个解决方案,使用CASE-WHEN语句来识别控制列中的更改。

    在下面的T-SQL中,我用原始数据(RecordID、Date、Weight和Control)将表命名为“Flori”。

    SELECT      f.RecordID, f.Date, f.Weight, f.Control, 
                SUM(x.Change) OVER (ORDER BY f.RecordId) + 1 as [Group]
    FROM 
                (SELECT RecordID, 
                    (SELECT 
                        CASE 
                            WHEN Control != 
                                 (SELECT Control FROM Flori WHERE RecordId = f.RecordID - 1)  
                                THEN 1 
                            ELSE 0 
                        END
                    ) as Change
                FROM Flori as f) as x
    INNER JOIN  Flori f on x.RecordID = f.RecordID
    GROUP BY    f.RecordID, f.Date, f.Weight, f.Control, x.Change