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

按分区组划分的SQL Server延迟

  •  0
  • altwood  · 技术社区  · 6 年前

    我的数据表如下:

    +----+-------+----------+
    | id | value | group_id |
    +----+-------+----------+
    |  1 |  -200 |        0 |
    |  2 |  -620 |        0 |
    |  3 |  -310 |        0 |
    |  4 |   400 |        1 |
    |  5 |   300 |        1 |
    |  6 |   100 |        1 |
    |  7 |  -200 |        2 |
    |  8 |  -400 |        2 |
    |  9 |  -500 |        2 |
    +----+-------+----------+
    

    我想做的是为每条记录生成第四列,其中显示前一个group_id的最后一个值。

    +----+-------+----------+----------------+
    | id | value | group_id | LastValByGroup |
    +----+-------+----------+----------------+
    |  1 |  -200 |        0 |              0 |
    |  2 |  -620 |        0 |              0 |
    |  3 |  -310 |        0 |              0 |
    |  4 |   400 |        1 |           -310 |
    |  5 |   300 |        1 |           -310 |
    |  6 |   100 |        1 |           -310 |
    |  7 |  -200 |        2 |            100 |
    |  8 |  -400 |        2 |            100 |
    |  9 |  -500 |        2 |            100 |
    +----+-------+----------+----------------+
    

    到目前为止,我所做的工作分为两部分。首先,我使用LAST_VALUE函数获取每组中的最后一个值。然后我尝试使用LAG函数从上一组中获取最后一个值。不幸的是,我的代码的第二部分没有按预期工作。

    这是我的密码:

    CREATE TABLE #temp
    (
        id int identity(1,1),
        value int,
        group_id int
    )
    
    INSERT #temp VALUES(-200,0)
    INSERT #temp VALUES(-620,0)
    INSERT #temp VALUES(-310,0)
    INSERT #temp VALUES(400,1)
    INSERT #temp VALUES(300,1)
    INSERT #temp VALUES(100,1)
    INSERT #temp VALUES(-200,3)
    INSERT #temp VALUES(-400,3)
    INSERT #temp VALUES(-500,3)
    
    ;WITH cte AS
    (
        SELECT
            *,
            LastValByGroup = LAST_VALUE(Value) OVER(Partition By group_id ORDER BY id 
                                     RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
        FROM
            #temp
    ), lagged AS
    (
        SELECT
            *,
            LaggedLastValByGroup = LAG(LastValByGroup,1,0) OVER(Partition By group_id ORDER BY id)  
        FROM
            cte
    )
    SELECT * FROM lagged ORDER BY id
    
    DROP TABLE #temp
    

    这就是我得到的结果:

    +----+-------+----------+----------------+----------------------+
    | id | value | group_id | LastValByGroup | LaggedLastValByGroup |
    +----+-------+----------+----------------+----------------------+
    |  1 |  -200 |        0 |           -310 |                    0 |
    |  2 |  -620 |        0 |           -310 |                 -310 |
    |  3 |  -310 |        0 |           -310 |                 -310 |
    |  4 |   400 |        1 |            100 |                    0 |
    |  5 |   300 |        1 |            100 |                  100 |
    |  6 |   100 |        1 |            100 |                  100 |
    |  7 |  -200 |        3 |           -500 |                    0 |
    |  8 |  -400 |        3 |           -500 |                 -500 |
    |  9 |  -500 |        3 |           -500 |                 -500 |
    +----+-------+----------+----------------+----------------------+
    

    非常感谢您的帮助。

    谢谢

    0 回复  |  直到 6 年前
        1
  •  0
  •   sacse    6 年前

    你可以用 first_value 如下面所示,以获得所需的结果。

    select distinct t2.*, ISNULL(FIRST_VALUE(t1.[value]) over(partition by t1.group_id order by t1.id desc), 0) LastValByGroup
    from @data t1
    right join @data t2 on t1.group_id + 1 = t2.group_id
    

    请查找数据库<&燃气轮机;不停摆弄 here

    推荐文章