SSMS SQL - сравнить одну строку в таблице с предыдущей - изменение статуса - PullRequest
1 голос
/ 20 марта 2019

Я использую таблицу, которая содержит еженедельные записи о возможностях и их соответствующем статусе.Я хочу сравнить самый последний статус возможности и неделю, предшествующую ей (например: статус меняется с «Поиск» на «Переговоры»).Я хочу взять все те, которые имеют измененное значение на этой неделе по сравнению с предыдущей неделей, и вставить в новую таблицу. Примечание: В этой таблице для Недели 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

Я получаю сообщение об ошибке, что имена столбцов должны быть уникальными.Это фактический текст ошибки: «Имена столбцов в каждой таблице должны быть уникальными. Имя столбца« Acc_Num »в таблице« Goal_Table »указывается более одного раза».

Спасибо за любую помощь или руководство

1 Ответ

0 голосов
/ 20 марта 2019

это можно сделать намного проще, используя аналитические функции, которые легче читать и в большинстве случаев даже быстрее.Я привожу пример использования 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), хотя для сравнения с ней нет недели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...