合并多行记录

ybvb 2010-10-10 02:37:46
DATE A B C D
201009140945 12.35 12.38 12.35 12.35
201009140950 12.35 12.42 12.35 12.40
201009140955 12.40 12.44 12.40 12.43
201009141000 12.43 12.46 12.42 12.44
201009141005 12.46 12.53 12.46 12.47
201009141010 12.47 12.47 12.46 12.47

每三行合并成一行
第一行的A值是合并行A值
第三行的D值是合并行D值
合并行的B是三行B中的最大值
合并行的C是三行C中的最小值

结果

DATE A B C D
201009140955 12.35 12.44 12.35 12.43
201009141010 12.43 12.53 12.42 12.47

数据量大,需要最佳性能,用sql语句生成。

...全文
134 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
叶子 2010-10-10
  • 打赏
  • 举报
回复
数据逻辑比较复杂,当数据量大的时候,怎么样效果都不会太好。
SQLCenter 2010-10-10
  • 打赏
  • 举报
回复
--> 测试数据:#
if object_id('tempdb.dbo.#') is not null drop table #
create table #(DATE bigint, A float, B float, C float, D float)
insert into #
select 201009140945, 12.35, 12.38, 12.35, 12.35 union all
select 201009140950, 12.35, 12.42, 12.35, 12.40 union all
select 201009140955, 12.40, 12.44, 12.40, 12.43 union all
select 201009141000, 12.43, 12.46, 12.42, 12.44 union all
select 201009141005, 12.46, 12.53, 12.46, 12.47 union all
select 201009141010, 12.47, 12.47, 12.46, 12.47

;with cte as
(
select row=row_number()over(order by DATE)-1, * from #
)
select
max(DATE)DATE,
A=max(case when row/3*3=row then A end),
B=max(B),
C=min(C),
D=max(case when row/3*3+2=row then D end)
from cte group by row/3

/*
DATE A B C D
-------------------- ---------------------- ---------------------- ---------------------- ----------------------
201009140955 12.35 12.44 12.35 12.43
201009141010 12.43 12.53 12.42 12.47
*/

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧