34,837
社区成员




create table Test_qudao
(
user_id nvarchar(20),qudao_name nvarchar(20),url nvarchar(100),ref_url nvarchar(100),flag int,time datetime
)
insert into test_qudao values('0001','百度','www.A.com','www.baidu.com',1,'2011-05-02 00:00:08')
insert into test_qudao values('0001','','www.A.com?a=1','www.A.com',0,'2011-05-02 00:01:08')
insert into test_qudao values('0001','','www.A.com?a=2','www.A.com',0,'2011-05-02 00:02:08')
insert into test_qudao values('0001','谷歌','www.A.com','www.google.com',1,'2011-05-02 00:03:08')
insert into test_qudao values('0001','','www.A.com?a=1','www.A.com',0,'2011-05-02 00:04:08')
insert into test_qudao values('0001','本网站','www.A.com','',1,'2011-05-02 00:08:08')
insert into test_qudao values('0001','','www.A.com?a=2','www.A.com',0,'2011-05-02 00:09:08')
insert into test_qudao values('0002','百度','www.A.com','www.baidu.com',1,'2011-05-02 00:15:00')
declare @qudao_name varchar(100),@ls varchar(100)
select @ls=qudao_name from (select top 1 qudao_name from test_qudao where qudao_name<>'') as tb
update Test_qudao set @qudao_name=@ls,
@ls=case when qudao_name='' then @ls else qudao_name end,
qudao_name=case when qudao_name='' then @qudao_name else qudao_name end
select qudao_name,count(*) pvcount,
sum(case flag when 0 then 1 else 0 end) toalsum
from Test_qudao group by qudao_name
/*
qudao_name pvcount toalsum
-------------------- ----------- -----------
百度 4 2
本网站 2 1
谷歌 2 1
(所影响的行数为 3 行)
*/
;WITH cte AS (
SELECT ROW_NUMBER()OVER(ORDER BY TIME ) AS rowid ,qudao_name,url,ref_url,flag,[TIME] FROM Test_qudao
)
SELECT * INTO Test_qudao_1 FROM cte
GO
CREATE FUNCTION fn_getname ( @time DATETIME )
RETURNS NVARCHAR(20)
AS BEGIN
RETURN ( SELECT qudao_name
FROM Test_qudao_1
WHERE rowid = ( SELECT MAX(rowid) AS rowid
FROM ( SELECT MAX([rowid]) AS [rowid],
qudao_name
FROM Test_qudao_1
WHERE time <= @time
AND flag = 1
GROUP BY qudao_name
) a
)
)
END
GO
SELECT NAME,
SUM(pvcount) AS pvcount,
SUM(toalsum) AS toalsum
FROM ( SELECT NAME,
COUNT(flag) AS pvcount,
( SELECT COUNT(rowid)
FROM Test_qudao_1 b
WHERE a.rowid = b.rowid
AND b.flag = 1
) AS toalsum
FROM ( SELECT *,
dbo.fn_getname(time) AS NAME
FROM Test_qudao_1 a
) a
GROUP BY a.NAME,
a.rowid
) a
GROUP BY NAME
/*
NAME pvcount toalsum
百度 4 2
本网站 2 1
谷歌 2 1
*/