Sql server 2008 从同一表中的行中选择值和下一个最高值

Sql server 2008 从同一表中的行中选择值和下一个最高值,sql-server-2008,tsql,Sql Server 2008,Tsql,我有一张这样的桌子 LowerPoints MessageTemplate 0 zero 10 ten 100 hundred 我想从中进行选择,这样我就有了一个lowerPoints列表,然后是lowerPoints e、 g 返回 LowerPoints UpperPoints MessageTemplate 0 10 zero 10 100 ten 但是我不知道

我有一张这样的桌子

LowerPoints MessageTemplate
0           zero
10          ten
100         hundred
我想从中进行选择,这样我就有了一个
lowerPoints
列表,然后是
lowerPoints

e、 g

返回

LowerPoints UpperPoints MessageTemplate
0           10          zero
10          100         ten
但是我不知道如何获取第三个值,并为
UpperPoints
指定一个“null”值。i、 e.最后一排是

100                     hundred

使用过时的语法(用逗号分隔表)将被视为内部联接。 你可以这样写:

select
    low.LowerPoints As LowerPoints
    , high.LowerPoints as UpperPoints
    , low.MessageTemplate as MessageTemplate
from MessageTemplate low
LEFT JOIN MessageTemplate high
ON high.LowerPoints = (select top 1 LowerPoints from MessageTemplate where LowerPoints > low.LowerPoints order by LowerPoints)
您还可以使用一个简单的子选择

Declare @a Table (LowerPoints int, MessageTemplate varchar(30))
insert into @a Values(0,'zero'),(10,'ten'),(100,'hundred')

Select a.LowerPoints
     ,(Select top 1 LowerPoints from @a b 
       where b.LowerPoints>a.LowerPoints
       order by b.LowerPoints) as UpperPoints
     ,a.MessageTemplate
from @a a
Order by LowerPoints
或者一个CTE生成一个定义的行号(rn),在条件b.rn=a.rn+1的情况下,该行号(rn)与自身左连接

;With CTE as
(
Select LowerPoints,MessageTemplate
       ,ROW_NUMBER() OVER (ORDER by LowerPoints) as rn
from @a a
)
Select c1.LowerPoints
      ,c2.LowerPoints as UpperPoints
      ,c1.MessageTemplate 
from CTE c1
LEFT JOIN CTE c2 on c2.rn=c1.rn +1 
Order by c1.LowerPoints

谢谢你…向左走join@Vasily如果是同一时间,则无需删除任何内容。
;With CTE as
(
Select LowerPoints,MessageTemplate
       ,ROW_NUMBER() OVER (ORDER by LowerPoints) as rn
from @a a
)
Select c1.LowerPoints
      ,c2.LowerPoints as UpperPoints
      ,c1.MessageTemplate 
from CTE c1
LEFT JOIN CTE c2 on c2.rn=c1.rn +1 
Order by c1.LowerPoints
--create temp table   
 IF object_id('tempdb..#test') IS NOT NULL
        DROP TABLE #test
    CREATE TABLE #test  (LowerPoint INT,MessageTemplate VARCHAR(10))
    INSERT INTO #test VALUES (0 ,'Zero'), (10,'ten'), (100,'hundred');
------------------------------------------------------------------------

    WITH cte
    AS (SELECT *,row_number() OVER (ORDER BY LowerPoint) AS RN
        FROM #test)

    SELECT a.LowerPoint
        ,b.LowerPoint AS UpperPoints
        ,a.MessageTemplate
    FROM cte a
    LEFT JOIN cte b
        ON (a.rn + 1) = b.rn