Выберите значение инициализации в запросе обнаружения изменений значений

#sql #tsql #sql-server-2008

#sql #tsql #sql-server-2008

Вопрос:

У меня есть запрос, в котором я обнаруживаю изменения значения

             With RankedDates As
            (
                Select T1.RecTime, T1.Col, T1.Message, T1.ismsg
                    , Row_Number() Over( Partition By T1.Col Order By T1.[RecTime] ) As Num
                From [ActvXDeltaOut] As T1
            )
            Select T1.[RecTime], T1.Col
                , T1.Message As InitialValue
                , T1.ismsg As Value
                , T2.[RecTime] As ChangedDate
            From RankedDates As T1
                Join RankedDates As T2
                    On T2.Col = T1.Col
                        And T2.Num = T1.Num   1
                        And T2.ismsg <> T1.ismsg
  

Но когда первое значение равно 1, мне также нужно сохранить этот узел, поэтому начальное значение должно быть 0, а не первое значение из запроса, потому что, если я получу 1-> 0, я никогда не узнаю, что было 1, но мне нужно это знать. И если там 0, мне все равно.

например, если у меня есть аналогичный первый узел :

2011-03-01 00:00:00.000 1 Сообщение

Мне нужно это получить.

добавлено :

У меня есть стек данных без T2.ismsg <> T1.ismsg аналогично :

2011-03-01 00:00:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 00:10:00.000 2011-03-01 00:10:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 00:20:00.000 2011-03-01 00:20:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 00:30:00.000 2011-03-01 00:30:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 00:40:00.000 2011-03-01 00:40:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 00:50:00.000 2011-03-01 00:50:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 01:00:00.000 2011-03-01 01:00:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 01:10:00.000 2011-03-01 01:10:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 01:20:00.000 2011-03-01 01:20:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 01:30:00.000 2011-03-01 01:30:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 01:40:00.000 2011-03-01 01:40:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 01:50:01.000 2011-03-01 01:50:01.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 02:00:01.000 2011-03-01 02:00:01.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 02:10:01.000 2011-03-01 02:10:01.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 02:20:01.000 2011-03-01 02:20:01.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 02:30:01.000

с помощью T2.ismsg <> T1.ismsg я ничего не получил

Если первый ismsg = 1, как у меня здесь, для каждого столбца (T2.Col = T1.Col) мне нужно вывести этот первый узел, аналогично :

2011-03-01 00:00:00.000 PBSU311PBSU311_F Длинное сообщение 1 2011-03-01 00:10:00.000

Итак, мне нужно каким-то образом инициализировать ismsg по умолчанию для всех значений, равных 0, чтобы получить его

Комментарии:

1. Существуют другие способы решения этой проблемы «островов», которые не требуют самостоятельного соединения. Если вы предоставите скрипт для заполнения табличной переменной, представляющей ActvXDeltaOut желаемые результаты, я предоставлю ответ.

Ответ №1:

Поместите:

         From RankedDates As T1
            Right Join RankedDates As T2
                On T2.Col = T1.Col
                   And T2.Num = T1.Num   1
        Where T2.ismsg <> T1.ismsg
           Or T1.Col IS NULL
  

Можете ли вы попробовать:

         From RankedDates As T1
            Join RankedDates As T2
                On T2.Col = T1.Col
                    And T2.Num = T1.Num   1
        Where T2.ismsg <> T1.ismsg
            Or ( T1.ismsg = 1
                And T1.Num = 1
               ) 
  

Комментарии:

1. это не совсем то, что я хотел иметь) Мне нужно, чтобы это обрабатывало его (добавляло этот узел) только тогда, когда ismsg равен 1 для каждого столбца. Я не могу обработать столбец NULL… Даже не могу полностью понять логику этого.

2. Опубликуйте некоторые примеры табличных данных с тем, что вы хотите вернуть.

3. Был бы мой ответ таким, как вы хотите, если бы значения NULL были преобразованы в 0?

4. @ypercube, я добавил дополнительное описание с примером к вопросу.