Как сравнить с приведенной выше записью на сервере sql - PullRequest
0 голосов
/ 11 сентября 2018

Я публикую примеры данных, которые я получил после выполнения моего запроса, чтобы избежать путаницы.Вот пример данных:

ID  Original    NET LEVELS
1000    2122    8534    1
1000    2123    8500    1
1000    2123    8500    2
1000    2123    8500    3
1000    2124    8577    1
1000    2124    8577    2
1000    2124    8578    3
1000    2124    8578    4 

Как я могу получить этот вывод:

ID  Original    NET LEVELS Equal 
1000    2122    8534    1   No 
1000    2123    8500    1   YES
1000    2123    8500    2   YES
1000    2123    8500    3   YES
1000    2124    8577    1   YES
1000    2124    8577    2   YES
1000    2124    8578    3   NO
1000    2124    8578    4   YES

На самом деле здесь нужно сравнить каждую строку с вышеуказанной строкой на основе комбинации оригинала и NETи столбцы уровней.Если обе строки равны, тогда «YES» и ниже строки и выше строки не равны, тогда «NO»

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Возможно, запрос ниже поможет вам решить вашу проблему.

CREATE table #test
(
    ID int
    ,oringal int
    ,NET int
    ,Levels int
)

insert into  #test
select 1000   , 2122 ,   8534  ,  1
union select 1000,    2123  ,  8500   , 1
union select 1000,    2123  ,  8500   , 2
union select 1000,    2123  ,  8500   , 3
union select 1000,    2124  ,  8577   , 1
union select 1000,    2124  ,  8577   , 2
union select 1000,    2124  ,  8578   , 3
union select 1000,    2124  ,  8578   , 4 

SELECT 
    ID
    ,oringal
    ,NET
    ,Levels
    ,CASE WHEN oringal=ISNULL(orignalLAG,orignalLEAD) AND NET= ISNULL(NETLAG,NETLEAD) THEN 'Yes' ELSE 'No' ENd as Eual

FROM
(
select  
*
,LAG(oringal) OVER  (PARTITION BY oringal   ORDER BY oringal  ) as orignalLAG
,LAG(NET)  OVER  (PARTITION BY oringal  ORDER BY oringal  )  as NETLAG
,LEAD(oringal) OVER  (PARTITION BY oringal ORDER BY oringal  ) as orignalLEAD
,LEAD(NET)  OVER  (PARTITION BY oringal ORDER BY oringal  )  as NETLEAD
from #test
)q
0 голосов
/ 11 сентября 2018

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

WITH CTE AS -- end previous statement with semi-colon
(
    SELECT ID, Original, NET, LEVELS, ROW_NUMBER() OVER (PARTITION BY NET, LEVELS ORDER BY NET)) AS RowNumb
    FROM TableA
)

SELECT *, CASE WHEN C.RowNumb = 1 THEN 'No' ELSE 'Yes' END AS Equal 
FROM CTE AS C
LEFT JOIN CTE AS C2 ON C.RowNumb = C2.RowNumb - 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...