22,210
社区成员
发帖
与我相关
我的任务
分享
USE tempdb
GO
IF OBJECT_ID('dbo.[t]') IS NOT NULL
DROP TABLE dbo.[t]
GO
CREATE TABLE dbo.[t](
[X_ID] INT
,[X_WaveLength] DECIMAL(28,16)
,[X_Strength] INT
,[X_Time] DATETIME
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[t] VALUES(N'17429',N'146.389662260571',N'36',N'2018-11-12 10:11:34.000')
INSERT INTO dbo.[t] VALUES(N'17430',N'146.40408994652',N'31',N'2018-11-12 10:11:34.000')
INSERT INTO dbo.[t] VALUES(N'17431',N'146.418516935926',N'32',N'2018-11-12 10:11:34.000')
INSERT INTO dbo.[t] VALUES(N'17432',N'146.432943228897',N'33',N'2018-11-12 10:11:34.000')
INSERT INTO dbo.[t] VALUES(N'17433',N'146.44736882554',N'41',N'2018-11-12 10:11:34.000')
--定义多少行一组,为了方便对照,这里取 2 。你实际应用改为15
DECLARE @n INT
SET @n=2
;WITH cte AS (
SELECT ROW_NUMBER() OVER (ORDER BY x_id) AS rid,* FROM t
)
SELECT
(rid+@n-1)/@n AS groupId
,SUM(X_Strength) AS X_Strength_sum
,AVG(X_Strength*1.0) AS X_Strength_avg
FROM cte
GROUP BY (rid+@n-1)/@n
/*
groupId X_Strength_sum X_Strength_avg
-------------------- -------------- ---------------------------------------
1 67 33.500000
2 65 32.500000
3 41 41.000000
*/
SELECT SEQ,SUM(X_Strength) AS TOTAL,AVG(X_Strength) AS AVERAGE
FROM
(SELECT *,(ROW_NUMBER() OVER (ORDER BY X_ID)-1)/15 AS SEQ FROM TABLE) AS A
GROUP BY SEQ
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([X_ID] int,[X_WaveLength] FLOAT,[X_Strength] FLOAT,[X_Time] Date)
Insert #T
select 1,146,86,'2018-11-12' union all
select 2,146,78,'2018-11-12' union all
select 3,146,73,'2018-11-12' union all
select 4,146,80,'2018-11-12'
Go
--测试数据结束
SELECT SEQ,SUM(X_Strength) AS TOTAL,AVG(X_Strength) AS AVERAGE
FROM
(SELECT *,(ROW_NUMBER() OVER (ORDER BY X_ID)-1)/2 AS SEQ FROM #T) AS A
GROUP BY SEQ
GROUP BY (rid+@n-1)/@n
ORDER BY 1 --增加排序
GROUP BY (rid+@n-1)/@n
ORDER BY 1 --增加排序