Sql 按名称的出现率检索名称

Sql 按名称的出现率检索名称,sql,Sql,我对SQL查询有些陌生,我正在努力解决这个特殊的问题。 假设我有一个查询,为了简单起见,它将以下3条记录保存在一列中: 汤姆 杰克 汤姆 我想让这些结果按名称分组,还包括该名称在返回的总记录中出现的分数比率 因此,预期结果将为两列: 汤姆| 2/3 杰克| 1/3 我该怎么做呢?确定分子非常简单,我可以使用COUNT和GROUP BY name,但我很难将其转换为返回的总行数的比率。由于分母是固定的,比率与分子成正比。除非您真的需要显示分母,否则只需使用以下内容就会容易得多: select na

我对SQL查询有些陌生,我正在努力解决这个特殊的问题。 假设我有一个查询,为了简单起见,它将以下3条记录保存在一列中: 汤姆 杰克 汤姆

我想让这些结果按名称分组,还包括该名称在返回的总记录中出现的分数比率

因此,预期结果将为两列: 汤姆| 2/3 杰克| 1/3


我该怎么做呢?确定分子非常简单,我可以使用COUNT和GROUP BY name,但我很难将其转换为返回的总行数的比率。

由于分母是固定的,比率与分子成正比。除非您真的需要显示分母,否则只需使用以下内容就会容易得多:

select name, count(*) from your_table_name
group by name
order by count(*) desc
您将以正确的顺序获得正确的数据,但显示的数字将是计数,而不是比率


如果你真的想要分母,你可以对同一个select的非分组版本进行计数*,但这取决于select所需的时间,可能会非常慢。

因为分母是固定的,所以比率与分子成正比。除非您真的需要显示分母,否则只需使用以下内容就会容易得多:

select name, count(*) from your_table_name
group by name
order by count(*) desc
SELECT name, COUNT(name)/(SELECT COUNT(1) FROM names) FROM names GROUP BY name;
您将以正确的顺序获得正确的数据,但显示的数字将是计数,而不是比率


如果你真的想要分母,你可以对同一个select的非分组版本进行计数*,但这取决于select所需的时间,这可能会非常慢。

在我的例子中,名称部分实际上是它自己的长查询。我是否必须复制并粘贴整个子查询才能在常规查询中显示两次?或者有没有一种方法可以执行类似于选择名称、COUNTname/从选择中选择COUNT1的操作。。。按名称从my_子查询组中作为my_子查询?如果有,我似乎无法正确理解语法。另外,您提供的查询结构也可以,但我必须将COUNT1更改为CASTCOUNT1作为float,因为否则它将执行整数除法并返回所有零。在我的例子中,names部分实际上是它自己的长查询。我是否必须复制并粘贴整个子查询才能在常规查询中显示两次?或者有没有一种方法可以执行类似于选择名称、COUNTname/从选择中选择COUNT1的操作。。。按名称从my_子查询组中作为my_子查询?如果有,我似乎无法正确理解语法。另外,您提供的查询结构也可以,但我必须将COUNT1更改为CASTCOUNT1作为float,因为否则它将执行整数除法并返回所有零。我希望使用比率而不仅仅是纯计数,是因为我在数据上使用了该过滤器。也就是说,如果Tom占返回记录的一半以上,我只想返回Tom。否则,我认为这只是噪音。有没有更聪明的方法?也许我应该在我的应用程序代码中这样做?@jjiffer:也许一个大概的答案会有用?只有一个组可能占记录总数的一半以上,因此,您是否可以返回包含最高计数的记录?这不一定会超过记录的一半,但对于你的目的来说,可能已经足够接近了?这是一个很好的观点,但如果没有足够令人信服的答案,我也可以选择不返回任何内容。我可能会稍微调整一下,比较一下使用更粗糙近似的计算时间和精度,看看接下来会出现什么技术。谢谢你的帮助!我之所以想要这个比率而不是单纯的计数,是因为我在数据上使用了一个过滤器。也就是说,如果Tom占返回记录的一半以上,我只想返回Tom。否则,我认为这只是噪音。有没有更聪明的方法?也许我应该在我的应用程序代码中这样做?@jjiffer:也许一个大概的答案会有用?只有一个组可能占记录总数的一半以上,因此,您是否可以返回包含最高计数的记录?这不一定会超过记录的一半,但对于你的目的来说,可能已经足够接近了?这是一个很好的观点,但如果没有足够令人信服的答案,我也可以选择不返回任何内容。我可能会稍微调整一下,比较一下使用更粗糙近似的计算时间和精度,看看接下来会出现什么技术。谢谢你的帮助!
SELECT name, COUNT(name)/(SELECT COUNT(1) FROM names) FROM names GROUP BY name;