22,209
社区成员
发帖
与我相关
我的任务
分享
select * from (
select * from (
select * from (
select distinct
replace(convert(varchar, gamelog.intime, 102),'.','-') as date1,
count(*) as vistCount
from
gamelog
where
intime between '2011-06-01 00:00:00' and '2011-06-15 00:00:00' and factoryId=11
group by
replace(convert(varchar, gamelog.intime, 102),'.','-')
) as ta right join (
select distinct
replace(convert(varchar, gamelog.intime, 102),'.','-') as date2,
count(distinct iptvName) as userCount
from
gamelog
where
intime between '2011-06-01 00:00:00' and '2011-06-15 00:00:00' and factoryId=11
group by
replace(convert(varchar, gamelog.intime, 102),'.','-')
) as tb on date1=date2
)as ab left join (
select distinct
replace(convert(varchar, gamelog.intime, 102),'.','-') as date3,
cast(sum(datediff(s,outtime,intime)) /3600.00 as decimal(18,2)) as playTime
from
gamelog
where
intime between '2011-06-01 00:00:00' and '2011-06-15 00:00:00' and factoryId=11
group by
replace(convert(varchar, gamelog.intime, 102),'.','-')
) as tc
on date2=date3
) as abc left join (
select replace(convert(varchar, Ta.intime, 102),'.','-')as date4,COUNT(Ta.iptvName) as newUserCount
from (select *,rownum= ROW_NUMBER ()over(partition by iptvName order by intime)
from gamelog
where intime between '2011-06-01 00:00:00' and '2011-06-15 00:00:00' and factoryId=11 and
iptvName not in (select distinct iptvName from gamelog where intime<'2011-06-01 00:00:00') )as Ta
where Ta.rownum =1 group by replace(convert(varchar, Ta.intime, 102),'.','-')
)as td on date2=date4
if Object_id('Tmp_gamelog') si not null Drop table Tmp_gamelog;
select *, replace(convert(varchar, intime, 102),'.','-') as date
into Tmp_gamelog
from gamelog
where intime between '2011-06-01 00:00:00' and '2011-06-15 00:00:00' and factoryId=11;
create Index Tmp_gamelog_data
on Tmp_gamelog(date);
--其他你需要建立的索引
--.....
--然后对 Tmp_gamelog 查询,利用索引,应该会快很多
replace(convert(varchar, gamelog.intime, 102),'.','-')
,convert(varchar(10), gamelog.intime, 120)
SELECT
MQ1.*,
MQ2.NEWUSERCOUNT
FROM (SELECT CONVERT(VARCHAR(10), GG.INTIME, 102) AS DATE,
COUNT(GG.*) AS VISTCOUNT,
COUNT(DISTINCT GG.IPTVNAME) AS USERCOUNT,
CAST(SUM(DATEDIFF(s,GG.OUTTIME,GG.INTIME)) /3600.00 AS DECIMAL(18,2)) AS PLAYTIME
FROM
GAMELOG GG
WHERE GG.INTIME BETWEEN '2011-06-01 00:00:00' AND '2011-06-15 00:00:00' AND GG.FACTORYID=11
GROUP BY CONVERT(VARCHAR(10), GG.INTIME, 102)) MQ1
--以下这个query 不知道楼主为了啥??能说明一下吗? 如果单纯为了取时间2011-06-01 00:00:00之后的新用户,貌似不用这么复杂
LEFT JOIN (
SELECT CONVERT(VARCHAR(10), TA.INTIME, 102) AS DATE4,COUNT(TA.IPTVNAME) AS NEWUSERCOUNT
FROM (SELECT *,ROWNUM= ROW_NUMBER ()OVER(PARTITION BY IPTVNAME ORDER BY INTIME)
FROM GAMELOG
WHERE INTIME BETWEEN '2011-06-01 00:00:00' AND '2011-06-15 00:00:00' AND FACTORYID=11 AND
IPTVNAME NOT IN (SELECT DISTINCT IPTVNAME FROM GAMELOG WHERE INTIME<'2011-06-01 00:00:00') )AS TA
WHERE TA.ROWNUM =1 GROUP BY CONVERT(VARCHAR(10), TA.INTIME, 102)MQ2
ON MQ1.DATE=MQ2.DATE4