SSMS SQL - 将 table 中的一行与之前的行进行比较 - 状态更改

SSMS SQL - Compare one row in a table to previous - Status change

我使用 table,其中包含机会的每周记录及其各自的状态。我想比较机会的最新状态和之前一周的状态(例如:状态从潜在客户更改为谈判)。我想将本周与前一周相比值发生变化的所有值都取出并插入到新的 table 中。 注意:在这个table的Week中,0是当前周,1是前一周,2是前两周,依此类推。

Table 历史记录:

+--------+---------+-------------+-----+
|Acc_Num | Opp_Num |    Stage    | Week|
+--------+---------+-------------+-----+
|   1    |    1    |     Won     |  0  |
+--------+---------+-------------+-----+
|   1    |    1    | Negotiation |  1  |
+--------+---------+-------------+-----+
|   1    |    1    | Prospecting |  2  |
+--------+---------+-------------+-----+
|   1    |    2    | Prospecting |  0  |
+--------+---------+-------------+-----+
|   1    |    2    | Prospecting |  1  |
+--------+---------+-------------+-----+
|   2    |    1    | Negotiation |  0  |
+--------+---------+-------------+-----+
|   2    |    1    | Prospecting |  1  |
+--------+---------+-------------+-----+

目标 Ex Table:

+--------+---------+-------------+-----+
|Acc_Num | Opp_Num |    Stage    | Week|
+--------+---------+-------------+-----+
|   1    |    1    |     Won     |  0  |
+--------+---------+-------------+-----+
|   1    |    1    | Negotiation |  1  |
+--------+---------+-------------+-----+
|   2    |    1    | Negotiation |  0  |
+--------+---------+-------------+-----+
|   2    |    1    | Prospecting |  1  |
+--------+---------+-------------+-----+

我停留在比较上周阶段的第一步。这是我试过但没有用的 SQL代码:

SELECT *
INTO Goal_Table
FROM (
SELECT  Acc_Num
        ,Opp_Num
        ,Stage
        ,Week
        ,CONCAT(Acc_Num, Opp_Num,Week) AS Unq_ID
        FROM Table_History) as A
Left Join
(SELECT  Acc_Num
        ,Opp_Num
        ,Stage
        ,Week
        ,CONCAT(Acc_Num, Opp_Num,Week) AS Unq_ID
        FROM Table_History) as B
ON A.Unq_ID=B.Unq_ID AND A.Week=B.Week-1

我不断收到关于列名称需要唯一的错误。这是实际的错误文本:"Column names in each table must be unique. Column name 'Acc_Num' in table 'Goal_Table' is specified more than once."

感谢您的帮助或指导

使用分析函数可以更轻松地完成此操作,这些函数更易于阅读,而且大多数情况下甚至更快。我正在提供一个使用 t-sql 的示例,因为您正在引用 ssms:

create table dbo.Table_History
(
    Acc_Num int,
    Opp_Num int,
    Stage nvarchar(50),
    WeekNumber int
)
insert into dbo.Table_History
values
    (1,1,'won',0),
    (1,1,'Negotiation',1),
    (1,1,'Prospecting',2),
    (1,2,'Prospecting',0),
    (1,2,'Prospecting',1),
    (2,1,'Negotiation',0),
    (2,1,'Prospecting',1)

WITH CompareWeeks AS
(
    SELECT
        Acc_Num AS Acc_Num,
        Opp_Num AS Opp_Num,
        Stage AS Stage_Cur,
        WeekNumber as WeekNumber_cur,
        lag(Stage) over (partition by Acc_Num, Opp_Num order by WeekNumber desc) AS Stage_prev,
        lag(WeekNumber) over (partition by Acc_Num, Opp_Num order by WeekNumber desc) as WeekNumber_prev
    FROM dbo.Table_History
)
SELECT
    Acc_Num,
    Opp_Num,
    Stage_Cur,
    WeekNumber_cur
--INTO dbo.GoalTable
FROM CompareWeeks
WHERE Stage_Cur <> Stage_prev and Stage_prev is not null

请注意,您上面提供的示例似乎并不一致。您没有考虑 (1,1) 的第一行,但您考虑了 (2,1),即使之前没有一周可以与之比较。