当前位置: 代码迷 >> Sql Server >> 以自增ID替分组依据,每组中取第一行及组中的最大值
  详细解决方案

以自增ID替分组依据,每组中取第一行及组中的最大值

热度:38   发布时间:2016-04-24 09:31:14.0
以自增ID为分组依据,每组中取第一行及组中的最大值?
下表中有22行数据
CREATE TABLE #E_Goods 
( ID [int] IDENTITY(1,1) NOT NULL, Val1 [int], Val2 [int], Val3 [int]);INSERT INTO #E_Goods (Val1, Val2, Val3)

select 11250,11260,258  UNION ALL
select 11255,11257,74  UNION ALL
select 11248,11250,94  UNION ALL
select 11251,11254,85  UNION ALL
select 11251,11254,88  UNION ALL
select 11253,11260,126  UNION ALL
select 11258,11262,60  UNION ALL
select 11260,11272,107  UNION ALL
select 11267,11282,168  UNION ALL
select 11277,11286,160  UNION ALL
select 11285,11292,178  UNION ALL
select 11283,11285,173  UNION ALL
select 11284,11302,100  UNION ALL
select 11289,11292,127  UNION ALL
select 11291,11295,118  UNION ALL
select 11295,11309,527  UNION ALL
select 11294,11308,199  UNION ALL
select 11307,11316,73  UNION ALL
select 11314,11345,223  UNION ALL
select 11331,11344,192  UNION ALL
select 11322,11323,219  UNION ALL
select 11316,11322,127  UNION ALL
select 11315,11319,118;

ID列是自增序号,想以ID为分组依据,五行为一组数据,想得到每一组中(第一行(val1),第五行(val2),MAX(val3))

查询后得到如下结果:
ID val1 val2 val3
5 11250 11254 258
10 11253 11286 168
15 11285 11295 178
20 11295 11344 527
------解决思路----------------------
IF OBJECT_ID('tempdb..#E_Goods') IS NOT NULL
BEGIN
DROP TABLE #E_Goods
END
GO
CREATE TABLE #E_Goods 

ID [int] IDENTITY(1,1) NOT NULL, 
Val1 [int], 
Val2 [int], 
Val3 [int]
);
--插入数据
INSERT INTO #E_Goods (Val1, Val2, Val3)
select 11250,11260,258  UNION ALL
select 11255,11257,74  UNION ALL
select 11248,11250,94  UNION ALL
select 11251,11254,85  UNION ALL
select 11251,11254,88  UNION ALL
select 11253,11260,126  UNION ALL
select 11258,11262,60  UNION ALL
select 11260,11272,107  UNION ALL
select 11267,11282,168  UNION ALL
select 11277,11286,160  UNION ALL
select 11285,11292,178  UNION ALL
select 11283,11285,173  UNION ALL
select 11284,11302,100  UNION ALL
select 11289,11292,127  UNION ALL
select 11291,11295,118  UNION ALL
select 11295,11309,527  UNION ALL
select 11294,11308,199  UNION ALL
select 11307,11316,73  UNION ALL
select 11314,11345,223  UNION ALL
select 11331,11344,192  UNION ALL
select 11322,11323,219  UNION ALL
select 11316,11322,127  UNION ALL
select 11315,11319,118;

SELECT * FROM #E_Goods
/*
ID列是自增序号,想以ID为分组依据,五行为一组数据,想得到每一组中(第一行(val1),第五行(val2),MAX(val3))
查询后得到如下结果:
ID val1 val2 val3
5 11250 11254 258
10 11253 11286 168
15 11285 11295 178
20 11295 11344 527 
*/
;WITH t AS (
SELECt *, ((id-1)/5)+1 AS g FROM #E_Goods
)
SELECT (g*5) AS ID, 
(SELECT Val1 FROM t WHERE t.id=(a.g*5-4)) AS val1,
(SELECT Val2 FROM t WHERE t.id=(a.g*5)) AS val2,
MAX(A.Val3) AS val3 
FROM t A
GROUP BY A.g





确实做出来了, 不过, 您这题目着实……
------解决思路----------------------
给你一个笨法
declare @i int,@j int,@count int
set @i=1
set @j=5
select @count=COUNT(1) from #E_Goods

create table #t(id int,Val1 [int], Val2 [int], Val3 [int])
while(@j<=@count)
begin
insert into #t
select id,val1,val2,val3
from (select 1 item,val1
from #E_Goods where id=@i) t1
left join (select 1 item,val2
from #E_Goods where id=@j) t2 on t1.item=t2.item
left join (select 1 item,MAX(id) id,max(val3) val3
from #E_Goods where id between @i and @j) t3 on t1.item=t3.item

set @i=@i+5
set @j=@j+5
end

select * from #t
drop table #t

------解决思路----------------------
SELECT T1.ID
,T3.Val1
,T2.Val2
,T1.Val3
FROM (
SELECT MAX(ID)ID,MIN(ID)Val1ID,MAX(Val3)Val3
FROM #E_Goods
GROUP BY (ID-1)/5
) T1
JOIN #E_Goods T2 ON T1.ID=T2.ID
JOIN #E_Goods T3 ON T1.Val1ID=T3.ID
WHERE T1.ID%5=0
  相关解决方案