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