Как найти n-й термин в ЦКЛ - PullRequest
0 голосов
/ 04 января 2011

У меня есть таблица как под

Term
0
8
24
48
80
X

Желаемый результат:

Term1        Term2             Diff

0               8               8

8              24               16

24             48               24

48             80               32

80             x                40

У меня есть скрипт ниже

Declare @t Table(Term varchar(10))
Insert Into @t 
Select '0' Union All
Select '8' Union All
Select '24' Union All
Select '48' Union All
Select '80' Union All
Select 'X'

Пока я пробовал как

;With Cte1 As
(
    Select rn = ROW_NUMBER() Over(Order By (select 1)),* From @t
)
,cte2 as(
Select 
    Term1 = (Select term from Cte1 where rn=1)
    ,Term2 = (Select term from Cte1 where rn=2)
    ,Diff = Cast((Select term from Cte1 where rn=2) as int) - Cast((Select term from Cte1 where rn=1) as int)
)


Select * from cte2

Я не знаю, что делать в рекурсивной части cte2 ..

Требуется помощь

Ответы [ 2 ]

1 голос
/ 04 января 2011

Я не уверен, почему разница между 80 и x должна составлять 40, но вы можете справиться с этим, настроив CTE, чтобы вернуть то, что вам нужно для последнего ряда.

;WITH Cte1 AS
(
  SELECT rn = ROW_NUMBER() OVER (ORDER BY (SELECT 1)), * FROM @t
)
SELECT
  Term1 = Cte1.Term,
  Term2 = (SELECT Term FROM Cte1 AS a_CTE where a_CTE.rn = Cte1.rn + 1),
  Diff = CAST((SELECT CASE Term WHEN 'X' THEN 120 ELSE Term END
               FROM Cte1 AS a_CTE
               WHERE a_CTE.rn = Cte1.rn + 1) AS int)
         - CAST(Cte1.Term AS int)
FROM Cte1
WHERE ISNUMERIC(Cte1.Term) = 1
0 голосов
/ 04 января 2011

Я рекомендую использовать PIVOT, а не рекурсивный CTE.Ср .: http://msdn.microsoft.com/en-us/library/ms177410.aspx

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