2012-02-26 124 views
-1

在某些SQL上遇到一些麻烦。SQL查询计数除以相同查询的不同计数

看看下面的结果,例如:

LOC_CODE  CHANNEL    
------------ -------------------- 
3ATEST-01 CHAN2    
3ATEST-01 CHAN3    
3ATEST-02 CHAN4    

我需要做的就是上面的查询,并按频道分组计数,但我想,计数由计数划分的“ LOC_CODE“出现。结果

例子中,我后:

CHANNEL   COUNT 
---------------- ---------- 
CHAN2   0.5 
CHAN3   0.5 
CHAN4   1 

上面的解释是,CHAN2旁边出现“3ATEST-01”,而是“3ATEST-01”是LOC_CODE出现了两次,因此计数应该除以2.

我知道我可以通过基本上复制具有不同计数的查询来做到这一点,但底层查询相当复杂,并不真正想损害性能。

如果您想了解更多信息,请让我知道!

+1

问题; CHANNEL是独一无二的吗?如果没有,你能举一个你想用另一个LOC_CODE复制CHANNEL的结果的例子吗? – 2012-02-26 10:29:34

+0

嗨。频道不是唯一的(第一个结果可能在频道中有很多次)。我会对最后的外部查询做一笔总和。 – Lock 2012-02-26 10:42:20

回答

4

尝试:

select channel, 
     count(*) over (partition by channel, loc_code) 
     /count(*) over (partition by loc_code) as count_ratio 
from my_table 
+0

你先生是一个genuis – Lock 2012-02-27 00:23:51

1
SELECT t.CHANNEL, COUNT(*)/gr.TotalCount 
FROM my_table t JOIN (
    SELECT LOC_CODE, COUNT(*) TotalCount 
    FROM my_table 
    GROUP BY LOC_CODE 
) gr USING(LOC_CODE) 
GROUP BY t.LOC_CODE, t.CHANNEL 

创建于(LOC_CODE, CHANNEL)

一个指标。如果没有重复的通道,1/gr.TotalCount取代COUNT(*)/gr.TotalCount并取出GROUP BY条款

+0

是否有不同的方式,不涉及计数单独的子查询?我不认为有,但我的查询(在上面的例子中my_table t)是一个很长的查询,并希望避免重复这一点只是为了计数。 – Lock 2012-02-26 10:09:09

+0

@Lock:我不这么认为。您的要求之一是输出按“Channel”分组的结果。另一个是通过'Loc_Code'从一个组中进行计算。如果可能的话,它可能会使用分析(窗口)函数,如Mark Ba​​nnister的答案。 – 2012-02-26 11:20:06

0

你的要求仍然有点不清楚,我当它涉及到内容重复的频道,但是如果你想在CHANNEL和LOC_CODE上进行分组以后总结,这应该起作用;

SELECT L1.CHANNEL, 1/COUNT(L2.LOC_CODE) 
FROM Locations L1 
LEFT JOIN Locations L2 ON L1.LOC_CODE = L2.LOC_CODE 
GROUP BY L1.CHANNEL, L1.LOC_CODE 

演示here

1

首先,找到一个查询,让你正确的结果。然后,看看它是否可以优化。我的猜测是很难优化,因为您需要两个不同的分组,每个Channel一个和Loc_Code一个。

我甚至不能肯定这符合你的描述:

SELECT t.CHANNEL 
    , COUNT(*)/SUM(grp.TotalCount) 
FROM my_table t 
    JOIN 
     (SELECT LOC_CODE 
      , COUNT(*) TotalCount  --- or is it perhaps?: 
              --- COUNT(DISTINCT CHANNEL) 
     FROM my_table 
     GROUP BY LOC_CODE 
    ) grp 
    ON grp.LOC_CODE = t.LOC_CODE 
GROUP BY t.CHANNEL