SQL:选择列的顶部比例和其他列中的相应属性
Posted
技术标签:
【中文标题】SQL:选择列的顶部比例和其他列中的相应属性【英文标题】:SQL: Selecting top proportion of column and corresponding attributes in other columns 【发布时间】:2022-01-08 10:52:46 【问题描述】:假设我有这样的数据
group, city, user,
nyc_frisbee, nyc, joe,
nyc_frisbee, nyc, ben,
nyc_frisbee, sf, tim,
sf_cooking, sf, tim,
sf_cooking, atl, jon,
我的目标是得到
group, top_city, prob
nyc_firsbee, nyc, .66
sf_cooking, sf, .5
sf_ccoking, atl, .5
边缘案例:在下表中,nyc_frisbee 仅出现一次,因为只有一个***城市。但是,sf_cooking 出现了两次,因为 sf 和 atl 并列。
如何在 SQL 中完成此操作?
到目前为止我所拥有的:
SELECT group, city, top/total AS prob
FROM (
SELECT
group,
city,
freq,
MAX(freq) OVER(PARTITION BY group) AS top,
SUM(freq) OVER(PARTITION BY group) AS total
FROM
(SELECT group, city, COUNT(city) AS freq
FROM mytable
GROUP BY group, city) inner_query
) outer_query
WHERE outer.freq = outer.top
这不符合我的预期......
group, top_city, prob
nyc_firsbee, nyc, .66
nyc_firsbee, sf, .66
sf_cooking, sf, .5
sf_ccoking, atl, .5
因此,每个独特的组/城市组合都有一个具有相同概率值的行。
【问题讨论】:
您要查找的输出是什么?你已经解释了很多你不想要的东西,但没有解释你做什么。 查看第二个代码块 :) 哦,我现在明白了。我看错了。我的错。 请标记您的 RDBMS 完成@Stu (Presto) 【参考方案1】:怎么样:
WITH x as (
SELECT group, city, CAST(COUNT(*) AS FLOAT)/SUM(COUNT(*)) OVER(PARTITION BY group) AS prob
FROM mytable
GROUP BY group, city
)
SELECT x.*
FROM
x
INNER JOIN
(SELECT group, MAX(prob) maxprob FROM x GROUP BY group) y
ON
x.group = y.group AND
x.prob = y.maxprob
我们将我们的组/城市归结为
group, city, prob,
nyc_frisbee, nyc, 0.66,
nyc_frisbee, sf, 0.33,
sf_cooking, sf, 0.5,
sf_cooking, atl, 0.5,
并别名为 X,然后我们将其加入到 group, max(prob)
上的一个分组中。因为sf_cooking, 0.5
是最大值,所以连接匹配两次,保持平局,但 nyc 的最大值为 0.66,匹配一次,不包括 0.33
【讨论】:
【参考方案2】:看看以下是否适合你。首先计算概率,然后按概率排序,最后得到不同的行。
with x as (
select *,
Count(*) over(partition by group, City) * 1.0 / Count(*) over(partition by group) prob
from t
), r as (
select *, dense_rank() over(partition by group order by prob desc) rn
from x
)
select distinct group, city, prob
from r
where rn=1
【讨论】:
以上是关于SQL:选择列的顶部比例和其他列中的相应属性的主要内容,如果未能解决你的问题,请参考以下文章