【问题标题】:SSMS SQL - Compare one row in a table to previous - Status changeSSMS SQL - 将表中的一行与上一行进行比较 - 状态更改
【发布时间】:2019-03-19 23:17:03
【问题描述】:

我使用包含每周机会记录及其各自状态的表格。我想比较一个机会的最新状态和它之前的一周(例如:状态从 Prospecting 更改为 Negotiation)。我想将本周与前一周相比值发生变化的所有值都插入到新表中。 注意: 在此周表中,0 是本周,1 是前一周,2 是前两周,等等。

表历史记录:

+--------+---------+-------------+-----+
|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  |
+--------+---------+-------------+-----+

目标表前:

+--------+---------+-------------+-----+
|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

我不断收到关于列名称需要唯一的错误。这是实际的错误文本:“每个表中的列名必须是唯一的。表 'Goal_Table' 中的列名 'Acc_Num' 被指定了多次。”

感谢您的帮助或指导

【问题讨论】:

  • 您可能只想要SELECT A.* 而不是SELECT *。您还会遇到一个问题,即在您的JOIN 条件下,在表AB 中没有选择名为R 的列
  • SSMS 适用于 SQL Server,但您使用了 MySQL 标记。您可以将 mysql 更改为 sql-server 或从您的标题和标签中删除 ssms 吗?

标签: mysql sql ssms self-join


【解决方案1】:

使用分析功能可以更轻松地完成此操作,这些功能更易于阅读,甚至速度更快。当您引用 ssms 时,我提供了一个使用 t-sql 的示例:

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),即使没有前一周可以比较。

【讨论】:

  • 谢谢塔雷克!这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多