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:选择列的顶部比例和其他列中的相应属性的主要内容,如果未能解决你的问题,请参考以下文章

pandas中的SQL查询:根据其他列的组合在列中连接多行

根据表中其他列的值从同一表中的 2 列中选择信息

用其他表中列的唯一值数填充sql表中的列

Oracle sql根据其他列的条件从一列中获取数据

SQL:获取一列和相应的其他列的最大值[重复]

将一列拆分为其他列的 SQL 命令