Đây là hai phiên bản để làm điều này. Tôi đã thử nghiệm với 100000 hàng trải rộng trên 6000 ngày trên một máy tính thực sự chậm với bộ nhớ không đủ, và điều đó cho thấy rằng phiên bản cte nhanh hơn phiên bản vòng lặp. Các phiên bản khác được đề xuất ở đây (cho đến nay) chậm hơn rất nhiều, miễn là tôi đã hiểu được vấn đề chính xác.
đệ quy CTE (10 giây)
-- Table variable to hold count for each day
declare @DateCount table(d int, c int, rn int)
insert into @DateCount
select
datediff(d, 0, date_created) as d,
count(*) as c,
row_number() over(order by datediff(d, 0, date_created)) as rn
from reg
group by datediff(d, 0, date_created)
-- Recursive cte using @DateCount to calculate the running sum
;with DateSum as
(
select
d, c, rn
from @DateCount
where rn = 1
union all
select
dc.d, ds.c+dc.c as c, dc.rn
from DateSum as ds
inner join @DateCount as dc
on ds.rn+1 = dc.rn
)
select
dateadd(d, d, 0) as date_created,
c as total_num
from DateSum
option (maxrecursion 0)
Vòng (14 giây)
-- Table variable to hold count for each day
declare @DateCount table(d int, c int, rn int, cr int)
insert into @DateCount
select
datediff(d, 0, date_created) as d,
count(*) as c,
row_number() over(order by datediff(d, 0, date_created)) as rn,
0
from reg
group by datediff(d, 0, date_created)
declare @rn int = 1
-- Update cr with running sum
update dc set
cr = dc.c
from @DateCount as dc
where rn = @rn
while @@rowcount = 1
begin
set @rn = @rn + 1
update dc set
cr = dc.c + (select cr from @DateCount where rn = @rn - 1)
from @DateCount as dc
where rn = @rn
end
-- Get the result
select
dateadd(d, d, 0) as date_created,
cr as total_num
from @DateCount
Sửa 1 Phiên bản rất nhanh
The quirky update
-- Table variable to hold count for each day
declare @DateCount table(d int primary key, c int, cr int)
insert into @DateCount
select
datediff(d, 0, date_created) as d,
count(*) as c,
0
from reg
group by datediff(d, 0, date_created)
declare @rt int = 0
declare @anchor int
update @DateCount set
@rt = cr = @rt + c,
@anchor = d
option (maxdop 1)
-- Get the result
select
dateadd(d, d, 0) as date_created,
cr as total_num
from @DateCount
order by d
Ồ, tôi thấy [sql-server] được dành riêng cho MS: o Rất gây hiểu nhầm. – vbence
@vbence: Có vẻ như bạn chưa từng nghe về SQL Server. http://en.wikipedia.org/wiki/Microsoft_SQL_Server –
@ p.campbell Wow .. rất nhiều sự thù địch trong một nhận xét ngắn như vậy. – vbence