这是我的场景:
我有一个包含2列的单个表. ID和价值. ID是int,值是实数.
ID Value
1 6.7
2 8.9
3 4.5
5 3.2
8 2.5
9 2.1
10 1.0
15 2.3
18 2.4
19 4.0
20 3.2
我想编写一个接收分组编号(组)和操作(Op)的SP,并按以下方式返回一个新表:
组= 2,
Op = Max
IDstart IDend Value
1 2 8.9
3 5 4.5
8 9 2.5
10 15 2.3
18 19 4.0
20 20 3.2
组= 3,
Op = Min
IDstart IDend Value
1 3 4.5
5 9 2.1
10 18 1.0
19 20 3.2
组定义要合并到一行中的行数(在新表中),操作定义要对行组执行的操作,我需要的操作是最大,最小和平均.
最后一组可能包含的行数少于其他所有组.如果最后一个组具有单个值IDstart = IDEnd. ID是唯一的,但可能有“差距”.
我正在寻找最快的方式,任何帮助将不胜感激.
使用SQL Server 2008 R2
吉拉德.
最佳答案 推理是这样的
>使用ROW_NUMBER()
函数和某些算法可以创建一个虚拟列,将每个ID放在指定大小的组中.
>可以对此语句的结果进行分组,并且可以使用CASE
语句应用您指定的运算符.如果您需要其他运算符,则只需扩展此CASE语句即可.
脚本
DECLARE @Group INTEGER
DECLARE @Op VARCHAR(3)
SET @Group = 3
SET @Op = 'MIN'
;WITH q(ID, Value) AS (
SELECT 1, 6.7
UNION ALL SELECT 2, 8.9
UNION ALL SELECT 3, 4.5
UNION ALL SELECT 5, 3.2
UNION ALL SELECT 8, 2.5
UNION ALL SELECT 9, 2.1
UNION ALL SELECT 10, 1.0
UNION ALL SELECT 15, 2.3
UNION ALL SELECT 18, 2.4
UNION ALL SELECT 19, 4.0
UNION ALL SELECT 20, 3.2
)
SELECT [IDStart] = MIN(ID)
, [IDEnd] = MAX(ID)
, [Value] = CASE WHEN @Op = 'MAX' THEN MAX(Value)
WHEN @Op = 'MIN' THEN MIN(Value)
WHEN @Op = 'AVG' THEN AVG(Value)
END
FROM (
SELECT ID
, Value
, GroupRow = (ROW_NUMBER() OVER (ORDER BY ID) - 1) / @Group
FROM q
) q
GROUP BY
GroupRow