遇到一些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.
我知道我可以通过基本上使用不同的计数复制查询来实现此目的,但基础查询非常复杂,并不真正想损害性能。
如果您想了解更多信息,请与我们联系!
答案 0 :(得分:4)
尝试:
select channel,
count(*) over (partition by channel, loc_code)
/ count(*) over (partition by loc_code) as count_ratio
from my_table
答案 1 :(得分: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)
如果没有重复的渠道,请将COUNT(*) / gr.TotalCount
替换为1 / gr.TotalCount
并删除GROUP BY
条款
答案 2 :(得分: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
答案 3 :(得分:0)
当涉及到重复的CHANNEL时,您的要求对我来说仍然有点不清楚,但是如果您想要在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。