RGN ->区域名称,需要对每个区域进行统计的->事件,用于区域的->过滤器。因此,在NPR新闻中,我有汽车牌照的活动,我需要计算每一个地区的汽车牌照,并将其分成一周的7天。我的解决办法如下:
SELECT DISTINCT a.NAME,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 1 THEN 1 ELSE null END) as MON,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 2 THEN 1 ELSE null END) as TUE,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 3 THEN 1 ELSE null END) as WED,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 4 THEN 1 ELSE null END) as THU,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 5 THEN 1 ELSE null END) as FRI,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 6 THEN 1 ELSE null END) as SAT,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 7 THEN 1 ELSE null END) as SUN
FROM RGN a
LEFT JOIN NPR b
ON a.ID IN (
SELECT c.RGID
FROM RGF c
WHERE RTRIM(b.NUM) like RTRIM((REPLACE(c.RGFLT,'?','_')))
)
Group by a.NAME;在筛选器中,我需要将?替换为_以获得like()表达式。
这个查询给了我很好的结果,但是数据库中有4百万条记录,需要20分钟才能得到。你知道如何做到完全相同,但效率更高吗?
我试过使用SUM()而不是count,但是它不会改变任何东西。
@编辑我的下一次尝试是SELECT FROM NPR和join RGN,速度有点快,但还不够。
发布于 2015-03-13 13:39:38
SELECT a.NAME,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 1 THEN 1 ELSE null END) as MON,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 2 THEN 1 ELSE null END) as TUE,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 3 THEN 1 ELSE null END) as WED,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 4 THEN 1 ELSE null END) as THU,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 5 THEN 1 ELSE null END) as FRI,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 6 THEN 1 ELSE null END) as SAT,
COUNT(CASE WHEN DATEPART(dw,b.TM) = 7 THEN 1 ELSE null END) as SUN
FROM RGN a, RGF c
left JOIN NPR b
ON RTRIM(b.NUM) like RTRIM((REPLACE(c.RGFLT,'?','_')))
WHERE a.ID = c.RGID AND b.TM BETWEEN
Group by a.RGNAME具有100 k行~4s的执行时间,足够好,因为它是~12s
https://stackoverflow.com/questions/29027698
复制相似问题