分组查询前三条记录的和

Sam大哥 2008-12-08 11:38:58
有一张表
ID time core
9587 2008/01/01 10
9586 2008/02/01 20
9587 2008/05/04 21
9587 2008/07/01 15
9587 2008/04/01 30
我想根据时间,查出最早三个记录的和
9587 2008/07/01 61
.
.


...全文
203 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lucifer-He 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chenjunsheep 的回复:]
SQL codeselect top 3 sum(core) from 表 order by time
[/Quote]
这个貌似不对吧, 2楼的不错,简单方便,易于理解 :)

csdyyr 2008-12-08
  • 打赏
  • 举报
回复
DECLARE @TB TABLE(ID INT, time SMALLDATETIME,   core INT)
INSERT @TB
SELECT 9587, '2008/01/01', 10 UNION ALL
SELECT 9586, '2008/02/01', 20 UNION ALL
SELECT 9587, '2008/05/04', 21 UNION ALL
SELECT 9587, '2008/07/01', 15 UNION ALL
SELECT 9587, '2008/04/01', 30

SELECT *,ID2=IDENTITY(INT,1,1) INTO # FROM @TB ORDER BY ID,time

SELECT ID,SUM(CORE) AS CORE
FROM (SELECT *,SEQ=ID2-(SELECT COUNT(*) FROM # WHERE ID<A.ID) FROM # AS A) T
WHERE SEQ<=3
GROUP BY ID
ORDER BY ID

DROP TABLE #
/*
ID CORE
----------- -----------
9586 20
9587 61
*/
chenjunsheep 2008-12-08
  • 打赏
  • 举报
回复
select top 3 sum(core) from 表 order by time
csdyyr 2008-12-08
  • 打赏
  • 举报
回复
DECLARE @TB TABLE(ID INT, time SMALLDATETIME,   core INT)
INSERT @TB
SELECT 9587, '2008/01/01', 10 UNION ALL
SELECT 9586, '2008/02/01', 20 UNION ALL
SELECT 9587, '2008/05/04', 21 UNION ALL
SELECT 9587, '2008/07/01', 15 UNION ALL
SELECT 9587, '2008/04/01', 30

SELECT *,ID2=IDENTITY(INT,1,1) INTO # FROM @TB ORDER BY ID,time

SELECT SUM(CORE) AS CORE
FROM #
WHERE ID2<=3

DROP TABLE #
/*
CORE
-----------
60
*/
liangCK 2008-12-08
  • 打赏
  • 举报
回复
---------------------------------
-- Author: liangCK 小梁
-- Date : 2008-12-08 11:40:51
---------------------------------

--> 生成测试数据: @T
DECLARE @T TABLE (ID INT,time DATETIME,core INT)
INSERT INTO @T
SELECT 9587,'2008/01/01',10 UNION ALL
SELECT 9586,'2008/02/01',20 UNION ALL
SELECT 9587,'2008/05/04',21 UNION ALL
SELECT 9587,'2008/07/01',15 UNION ALL
SELECT 9587,'2008/04/01',30

--SQL查询如下:

SELECT DISTINCT
B.ID,
MAX(B.time) AS time,
SUM(B.core) AS core
FROM (
SELECT DISTINCT ID FROM @T
)AS A
CROSS APPLY(
SELECT TOP(3)
*
FROM @T
WHERE ID=A.ID
ORDER BY time
) AS B
GROUP BY B.ID

/*
ID time core
----------- ----------------------- -----------
9586 2008-02-01 00:00:00.000 20
9587 2008-05-04 00:00:00.000 61

(2 行受影响)

*/
水族杰纶 2008-12-08
  • 打赏
  • 举报
回复
select sum(core) from (select top 3 * from tb order by time)T
阳新互联 2008-12-08
  • 打赏
  • 举报
回复
简单问题复杂化
让别人觉得你很NB??
冷箫轻笛 2008-12-08
  • 打赏
  • 举报
回复

--借小梁的测试数据:
DECLARE @T TABLE (ID INT,time DATETIME,core INT)
INSERT INTO @T
SELECT 9587,'2008/01/01',10 UNION ALL
SELECT 9586,'2008/02/01',20 UNION ALL
SELECT 9587,'2008/05/04',21 UNION ALL
SELECT 9587,'2008/07/01',15 UNION ALL
SELECT 9587,'2008/04/01',30

--SQL查询如下:
select id,sum(core) as sum_core
from @t a
where time in (select top 3 time from @t where id = a.id order by time)
group by id

--结果集
/*
id sum_core
----------- -----------
9586 20
9587 61

(2 行受影响)
*/

tjg5202 2008-12-08
  • 打赏
  • 举报
回复
小梁的方法很不错呀。。。高手就是不一样
Lucifer-He 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 LiCeRForDream 的回复:]
引用 4 楼 chenjunsheep 的回复:
SQL codeselect top 3 sum(core) from 表 order by time

这个貌似不对吧, 2楼的不错,简单方便,易于理解 :)
[/Quote]

看错楼层,应该是1楼的不错:)
lonlyhawk 2008-12-08
  • 打赏
  • 举报
回复
select  distinct [ID],
(select sum(core) from
(select top 3 core from @tb where [ID]=t.[ID] order by [time]) a )
from @TB t
lintf1986 2008-12-08
  • 打赏
  • 举报
回复
UP
fbmsyu 2008-12-08
  • 打赏
  • 举报
回复
支持1楼,不明白2楼.

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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