如何在tsql中找到第n项

发布于 2024-10-10 08:36:36 字数 950 浏览 0 评论 0原文

我有一个如下表所需

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 的递归部分要做什么..

需要帮助

I have a table as under

Term
0
8
24
48
80
X

The desired output being

Term1        Term2             Diff

0               8               8

8              24               16

24             48               24

48             80               32

80             x                40

I have the below script

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'

So far I have tried as

;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

I donot know what to do in the recursive part of cte2..

Help needed

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

水波映月 2024-10-17 08:36:36

我不确定为什么 80x 之间的差异应该是 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

I'm unsure why the difference between 80 and x is supposed to be 40, but you can handle that by tweaking the CTE to return what you need for the last row.

;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
错爱 2024-10-17 08:36:36

我建议使用 PIVOT 而不是递归 CTE。参见: http://msdn.microsoft.com/en-us/library/ ms177410.aspx

I recommend using PIVOT and not a recursive CTE. Cf.: http://msdn.microsoft.com/en-us/library/ms177410.aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文