首页 > 解决方案 > SQL Server 查找数据更改前的行

问题描述

我有一组数据,其中可能有 2 条数据可以更改。

SerNoCondition。_

我需要能够检测到哪个首先更改并返回更改上方的行。

在下面的示例中:

由于条件首先发生变化,我需要返回上面的行TransID = 4

转号 部分 序列号 IN_Nr OUT_Nr 订单号 类型 健康)状况
1 123-1 abc123 232753 232233 888777 出去 新的
2 123-1 abc123 232753 无效的 125707 新的
3 123-1 abc123 203944 224789 125707 出去 新的
4 123-1 abc123 203944 无效的 123332 新的
5 123-1 abc123 179409 198306 123332 出去 老的
6 123-1 abc123 179409 无效的 111222 老的
7 123-1 cba999 176573 171516 111222 出去 老的
8 123-1 cba999 176573 无效的 666000 老的

我尝试使用ROW_NUMBER()OVER(PARTITION BY Condition... 来解决这个问题,并为 SerNo 做另一个 ROW_NUMBER() 然后聚合数据,但我似乎无法在它第一次更改时进行过滤。


    SELECT 
        *,
        CASE WHEN (ROW_NUMBER()OVER(PARTITION BY Condition ORDER BY TransID ASC)) > 1 THEN 1 ELSE 2 END Condition_Change,
        CASE WHEN (ROW_NUMBER()OVER(PARTITION BY SerNo ORDER BY TransID ASC)) > 1 THEN 1 ELSE 2 END SerNo_Change
    FROM 
    StkTrans


    CREATE TABLE StkTrans (
        TransID INT, 
        Part VARCHAR(25), 
        SerNo VARCHAR(25),
        IN_Nr INT, 
        OUT_Nr INT, 
        OrderNr INT, 
        Type    VARCHAR(3),
        Condition VARCHAR(5)
    )
    
    INSERT INTO StkTrans
    (TransID, Part, SerNo, IN_Nr, OUT_Nr, OrderNr, Type, Condition)
    VALUES
    (1, '123-1', 'abc123', 176573, NULL, 666000, 'IN', 'NEW' ),
    (2, '123-1', 'abc123', 176573, 171516, 111222, 'OUT', 'NEW' ),
    (3, '123-1', 'abc123', 179409, NULL, 111222, 'IN', 'NEW' ),
    (4, '123-1', 'abc123', 179409, 198306, 123332, 'OUT', 'NEW' ),
    (5, '123-1', 'abc123', 203944, NULL, 123332, 'IN', 'OLD' ),
    (6, '123-1', 'abc123', 203944, 224789, 125707, 'OUT', 'OLD' ),
    (7, '123-1', 'cba999', 232753, NULL, 125707, 'IN', 'OLD' ),
    (8, '123-1', 'cba999', 232753, 232233, 888777, 'OUT', 'OLD' )

标签: sqlsql-server

解决方案


您可以使用lead(). 我不确定你在问什么但是要在条件更改之前获取行:

select t.*
from (select t.*,
             lead(condition) over (partition by part order by transid) as next_condition
      from t
     ) t
where next_condition <> condition;

为其他列添加条件也很简单。


推荐阅读