[英]Create a sequence from the starting and ending values in a SQL Server 2008 table?
[英]Get Starting and ending of a Dataset in SQL Server 2008
我需要从表中提取数据集的起点和终点。 对于Ex,如果数据如下:
1
5
10
15
20
40
45
50
55
60
65
70
现在,这两个数据集分别是1-20和40-70。因此,数据将始终是顺序的,单个数据集中的点之间的差异最大为7。因此,结果查询应给我3列:
1. 5 15
2. 45 65
即数据集中的倒数第二个点。
是否可以在不使用forloop游标的情况下进行操作。 如果可以,请发布查询。 我尝试做的是使用over
和partition by
但没有运气
如果我对您的理解正确,这将返回您的要求。
DECLARE @tmp TABLE
(
numVal INT PRIMARY KEY
);
INSERT @tmp
VALUES
( 1 )
,( 5 )
,( 10 )
,( 15 )
,( 20 )
,( 40 )
,( 45 )
,( 50 )
,( 55 )
,( 60 )
,( 65 )
,( 70 );
;WITH breaks AS
(
SELECT
t.numval breakMax
, ROW_NUMBER()
OVER(
ORDER BY t.numval
) breakGroup
FROM
@tmp t
WHERE
NOT EXISTS
(
SELECT
NULL
FROM
@tmp t1
WHERE
t1.numVal > t.numVal
AND
t1.numVal <= t.numVal + 7
)
)
SELECT
v.breakGroup
, MIN(v.numval) secondNum
, MAX(v.numVal) secondLastNum
FROM
(
SELECT
t.numVal
, br.breakGroup
, ROW_NUMBER()
OVER(
PARTITION BY
br.breakGroup
ORDER BY
t.numval
) ar
, ROW_NUMBER()
OVER(
PARTITION BY
br.breakGroup
ORDER BY
t.numval DESC
) dr
FROM
@tmp t
CROSS APPLY
(
SELECT
TOP 1
breakGroup
FROM
breaks b
WHERE
b.breakMax >= t.numVal
ORDER BY
b.breakGroup
) br
) v
WHERE
v.ar = 2
OR
v.dr = 2
GROUP BY
v.breakGroup
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.