#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, я добавил дополнительное описание с примером к вопросу.