2012-02-26 152 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