34,593
社区成员
发帖
与我相关
我的任务
分享
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([bill_id] int,[time] int)
insert [tb] select 1,2
union all select 1,4
union all select 2,1
union all select 2,3
union all select 2,5
union all select 2,10
union all select 3,3
union all select 3,20
union all select 3,50
go
select bill_id,max([time])-min([time]) [time]
from tb
group by bill_id
/*
bill_id time
----------- -----------
1 2
2 9
3 47
(3 行受影响)
*/
---------------------------------
-- Author: liangCK 小梁
---------------------------------
--> 生成测试数据: @T
DECLARE @T TABLE (bill_id INT,time INT)
INSERT INTO @T
SELECT 1,2 UNION ALL
SELECT 1,4 UNION ALL
SELECT 2,1 UNION ALL
SELECT 2,3 UNION ALL
SELECT 2,5 UNION ALL
SELECT 2,10 UNION ALL
SELECT 3,3 UNION ALL
SELECT 3,20 UNION ALL
SELECT 3,50
--SQL查询如下:
SELECT ID=IDENTITY(INT,1,1),* INTO #T FROM @T;
SELECT
A.bill_id,
C.time-B.time AS time
FROM (
SELECT bill_id,MIN(ID) AS min_id,MAX(ID) AS max_id
FROM #T
GROUP BY bill_id
) AS A
JOIN #T AS B
ON A.bill_id=B.bill_id
AND A.min_id=B.ID
JOIN #T AS C
ON A.bill_id=C.bill_id
AND A.max_id=C.ID
DROP TABLE #T;
/*
bill_id time
----------- -----------
1 2
2 9
3 47
(3 行受影响)
*/
SELECT ID=IDENTITY(INT,1,1),* INTO #T FROM tb;
SELECT
A.bill_id,
C.time-B.time AS time
FROM (
SELECT bill_id,MIN(ID) AS min_id,MAX(ID) AS max_id
FROM #T
GROUP BY bill_id
) AS A
JOIN #T AS B
ON A.bill_id=B.bill_id
AND A.min_id=B.ID
JOIN #T AS C
ON A.bill_id=C.bill_id
AND A.max_id=C.ID