Значение нести за слово - PullRequest
1 голос
/ 08 марта 2011

у меня ниже SQL Query ..

SELECT     dbo.O3.[s.no] AS [O3_Sn.NO], dbo.O5.[s.no] AS [O5_Sn.NO], dbo.O3.O3, dbo.O5.O5,
case when dbo.O3.[s.no] > dbo.O5.[s.no] then 'true' else 'false' end as ComparisonColumn
FROM         dbo.O3 INNER JOIN
                      dbo.O5 ON dbo.O3.[s.no] = dbo.O5.[s.no]

Когда я бегу, я получаю ниже выхода ..

O3_Sn.NO    O5_Sn.NO    O3  O5  ComparisonColumn
1          1           10   11  TRUE
2          2           12   13  TRUE
3          3            11  10  FALSE
4          4            13  11  FALSE
5          5            15  16  TRUE
6          6            10  11  TRUE
7          7           12   13  TRUE

Я хочу запомнить значение ИСТИНА / Ложь и должен игнорировать, если оно повторяется, пока я не получу обратный случай, т. Е. Для ИСТИНА, Ложь .. и ДЛЯ ЛОЖЬ ..

Ниже я должен получить это ..

O3_Sn.NO O5_Sn.NO O3  O5    ComparisonColumn New_Case_Carry_value
1        1      10    11    TRUE             TRUE
2        2      12    13    TRUE             NULL
3        3      11    10    FALSE            FALSE
4        4      13    11    FALSE            NULL
5        5      15    16    TRUE             TRUE
6        6      10    11    TRUE             NULL
7        7      12    13    TRUE             NULL

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

Вы можете упорядочить вывод, используя row_number (), чтобы сравнить значение со значением предыдущей записи:

with cIntermediate as (
SELECT dbo.O3.[s.no] AS [O3_Sn.NO], dbo.O5.[s.no] AS [O5_Sn.NO], dbo.O3.O3, dbo.O5.O5, 
       case when dbo.O3.[s.no] > dbo.O5.[s.no] then 'true' else 'false' end 
          as ComparisonColumn,
       rowno = row_number() over 
          (order by dbo.O3.[s.no], dbo.O5.[s.no], dbo.O3.O3, dbo.O5.O5)
FROM   dbo.O3 INNER JOIN dbo.O5 ON dbo.O3.[s.no] = dbo.O5.[s.no] 
)
select i1.*, 
       case when i1.ComparisonColumn = i2.ComparisonColumn then null 
          else i1.ComparisonColumn end as NewCaseCarryValue
from cIntermediate i1
left join cIntermediate i2 on i2.rowno=i1.rowno-1
1 голос
/ 08 марта 2011

Хорошо, я объясню вам эту концепцию, и я уверен, что вы сможете сами ее понять.

Ваш окончательный результат, который вы опубликовали со всеми столбцами true и false, которые должны стать временной таблицей, как эта, но с каким-то столбцом идентификации:

SELECT dbo.o3.[s.no]  AS [O3_Sn.NO]
       ,dbo.o5.[s.no] AS [O5_Sn.NO]
       ,dbo.o3.o3
       ,dbo.o5.o5
       ,CASE
          WHEN dbo.o3.[s.no] > dbo.o5.[s.no] THEN 'true'
          ELSE 'false'
        END           AS comparisoncolumn
       , ROW_NUMBER() OVER(ORDER BY dbo.o3.[s.no]) AS ident_col
INTO #temp
FROM   dbo.o3
       INNER JOIN dbo.o5
         ON dbo.o3.[s.no] = dbo.o5.[s.no]

Тогда вам нужно выбрать из #temp и самостоятельно присоединиться к #temp аналогично тому, как здесь:

SELECT a.*
      , CASE WHEN a.comparisoncolumn = b.comparisoncolumn THEN NULL ELSE a.comparisoncolumn END AS final_comparisoncolumn
FROM #temp a
    LEFT JOIN #temp b ON a.ident_col = b.ident_col - 1

Затем выполните оператор case, чтобы выяснить, нужно ли вам печатать null, либо true, либо false.

Поэкспериментируйте с этой концепцией, я уверен, что вы сможете отработать ее отсюда.

0 голосов
/ 08 марта 2011

Вы можете выполнить левое соединение с самой таблицей (SN = SN-1) и сравнить столбец ComparisonColumn

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