22,207
社区成员
发帖
与我相关
我的任务
分享
if object_id('tempdb.dbo.#test') is not null drop table #test
CREATE TABLE #test(A VARCHAR(100),b FLOAT,c DATE)
INSERT INTO #test ( A, B ,c)
SELECT 'A01',10,'2017-10-06' UNION ALL
SELECT 'A01',50,'2017-10-07' UNION ALL
SELECT 'A01',30,'2017-10-16' UNION ALL
SELECT 'A01',5,'2017-10-17' UNION ALL
SELECT 'A01',30,'2017-10-18' UNION ALL
SELECT 'A01',5,'2017-10-20' UNION ALL
SELECT 'A01',5,'2017-10-21' UNION ALL
SELECT 'A01',5,'2017-10-22' UNION ALL
SELECT 'B01',10,'2017-10-06' UNION ALL
SELECT 'B01',10,'2017-10-07' UNION ALL
SELECT 'B01',10,'2017-10-20'
select * from #test
;with t as
(
select a,b,c from #test a where not exists(select 1 from #test b where a.a=b.a and (a.c > b.c and a.c<=dateadd(d,3,b.c)) )
union all
select a.a,a.b,min(a.c)over(partition by t.a,t.c) from #test a,t where a.A =t.a and a.c > dateadd(d,3,t.c) and a.c <=dateadd(d,6,t.c)
)
,t1 as(select distinct a,b,c from t)
select a,b=(select sum(b.b) from #test b where b.A =a.A and b.c between a.c and dateadd(d,3,a.c)),c from t1 a order by a,c
A b c
A01 10 2017-10-06
A01 50 2017-10-07
A01 30 2017-10-16
A01 5 2017-10-17
A01 30 2017-10-18
A01 5 2017-10-20
A01 5 2017-10-21
A01 5 2017-10-22
B01 10 2017-10-06
B01 10 2017-10-07
B01 10 2017-10-20
a b c
A01 60 2017-10-06
A01 65 2017-10-16
A01 15 2017-10-20
B01 20 2017-10-06
B01 10 2017-10-20
if not object_id(N'Tempdb..#test') is null
drop table #test
GO
CREATE TABLE #test(A VARCHAR(100),b FLOAT,c DATE)
INSERT INTO #test ( A, B ,c)
SELECT 'A01',10,'2017-10-06' UNION ALL
SELECT 'A01',50,'2017-10-07' UNION ALL
SELECT 'A01',30,'2017-10-16' UNION ALL
SELECT 'A01',5,'2017-10-17' UNION ALL
SELECT 'A01',5,'2017-10-20' UNION ALL
SELECT 'B01',10,'2017-10-06' UNION ALL
SELECT 'B01',10,'2017-10-07' UNION ALL
SELECT 'B01',10,'2017-10-20'
if not object_id(N'Tempdb..#temptest') is null
drop table #temptest
GO
CREATE TABLE #temptest(A VARCHAR(100),B FLOAT,C DATE)
declare @A VARCHAR(100),@b FLOAT,@c DATE,@tb FLOAT
SET @tb=0
declare auth_cur cursor for
select A,B, C
from #test ORDER BY c
open auth_cur
fetch next from auth_cur into @A,@b,@c
while (@@fetch_status=0)
begin
IF(NOT EXISTS(SELECT * FROM #temptest WHERE A=@A AND DATEDIFF(DAY,c,@c)<=3 ))
BEGIN
INSERT INTO #temptest VALUES(@A,@b,@c)
END
ELSE
BEGIN
UPDATE #temptest SET b=b+@b WHERE A=@A AND DATEDIFF(DAY,c,@c)<=3
END
fetch next from auth_cur into @A,@b,@c
end
close auth_cur
deallocate auth_cur
SELECT * FROM #temptest ORDER BY A,c
最小日期加3天