SQL-最小值和计数的组合
这是在Oracle数据库中。假设我有下表A:SQL-最小值和计数的组合,sql,oracle,aggregate-functions,oracle-sqldeveloper,Sql,Oracle,Aggregate Functions,Oracle Sqldeveloper,这是在Oracle数据库中。假设我有下表A: column1 column2 id1 a id2 a id3 a id4 b id5 b id6 c 因此,我希望sql所做的是: 首先计数有三个A,两个B和一个c,然后根据计数返回这些计数的最小值,在这种情况下是1(因为我们只有一个c) 这可以通过使用MIN和COUNT的组合来实现吗?尝试以下方法: SELECT MIN(Count) as MinVal FROM (SE
column1 column2
id1 a
id2 a
id3 a
id4 b
id5 b
id6 c
因此,我希望sql所做的是:
首先计数有三个A,两个B和一个c,然后根据计数返回这些计数的最小值,在这种情况下是1(因为我们只有一个c)
这可以通过使用MIN和COUNT的组合来实现吗?尝试以下方法:
SELECT MIN(Count) as MinVal
FROM
(SELECT column2,COUNT(column2) as Count
FROM TableA
GROUP BY column2) T
说明:
内部查询为表中column2
的每个值选择column2
的计数。然后使用外部查询选择最小计数
SELECT MIN(cnt)
FROM (SELECT COUNT(*) AS cnt
FROM my_table
GROUP BY column2)
编辑:正如ElmoVanKielmo所指出的,提供解决方案而不加以解释是毫无意义的。
内部查询按
column2
值对数据进行分组,并返回每个值的行数。外部查询将这些数据视为一组数字,并返回其中的最小值。如果使用Oracle 12,则无需子查询即可执行此操作:
select count(*) as cnt
from table t
group by cnt
order by cnt asc
fetch first 1 row only;
对于那些熟悉MySQL或Postgres的人来说,
仅获取前1行
相当于限制
,并允许您在不使用子查询的情况下限制输出行的数量。在Oracle中,您可以直接这样做;按组计数,并在结果上使用MIN返回一行所需值
select min(count(*))
from tablea
group by column1;
这应该对你有用
SELECT *
FROM(
SELECT Column2, COUNT(Column1)
FROM TableA
GROUP BY Column2
ORDER BY COUNT(Column1))
WHERE Rownum = 1
@Gordon Linoff:这在其他dbms中无效,但在Oracle中有效。您可以按组进行聚合,然后对这些结果进行另一次聚合,如上图所示,无需子查询(尽管我发现子查询通常可读性更好)。这一定是Oracle 11g中的新功能。我在Oracle10数据库上测试了它,得到了预期的错误。但是,它确实适用于SQL FIDLE()。@Gordon Linoff:它也适用于我的Oracle 10g Enterprise 10.2.0.4.0。因此,它也可能是标准版和企业版之间的差异。(我认为这很奇怪。)评论:对这个解决方案的一些描述是值得赞赏的。