【问题标题】:best way to get count and distinct count of rows in single query在单个查询中获取行数和不同行数的最佳方法
【发布时间】:2021-04-29 23:54:35
【问题描述】:

在单个查询中获取行数和不同行数的最佳方法是什么?

要获得不同的计数,我们可以像这样使用子查询:

select count(*) from
(
   select distinct * from table
)

我有超过 15 列,并且有许多重复的行,我想在一个查询中计算行数以及不同的行数。

如果我用这个会更多

select  count(*) as Rowcount , count(distinct *) as DistinctCount from table

这不会给出准确的结果,因为count(distinct *) 不起作用。

【问题讨论】:

  • 请查看我的答案部分。我已经更新了。我认为它会为你工作。请检查并让我知道。 :)
  • 是为了避免列出列吗?如果是这样,问题应该很清楚了。

标签: sql apache-spark count apache-spark-sql distinct


【解决方案1】:

为什么不把子查询放在另一个查询中?

select count(*),
       (select count(*) from (select distinct * from table))
from table;

【讨论】:

  • 它仍然没有给出计数和不同的计数,因为 select distinct * from table inner query 只过滤不同的行。对吗?
  • @AliHasan 不,过滤器仅适用于子查询,不适用于外部查询。外部查询仍然从table 中选择所有行。
【解决方案2】:

create table tbl
(
col int
);

insert into tbl values(1),(2),(1),(3);

select count(*) as distinct_count, sum(sum) as all_count 
from (
select count(col) sum from tbl group by col
)A

【讨论】:

  • 虽然这段代码可能会回答这个问题,但如果你解释更多 whyhow 这段代码,它对 OP 和未来的读者会更有用解决了问题
  • 但它正在计算内部查询中的一列。如果我们在一个表中有 15 列以上怎么办?
  • 在子查询中,您按表中的每一列分组以获得所有相同行的组,然后外部 select 语句为您获取此类组的数量,即不同的计数, 并且 eanch 组的计数之和为总计数
  • 将所有列分组是个好主意吗?当您有 15 列以上时
  • 实际上 distinct 运算符是重运算符之一,您在查询中无法避免它,所以我猜它的效率与按所有列分组的效率大致相同。我们可以对按运算符进行分区说同样的话。您可以启用查询分析器并查看发生了什么,但在我看来它们将大致相同。
【解决方案3】:

我想我已经理解你在寻找什么了。您需要使用一些窗口功能。
所以,你的查询应该是这样的 =>

Select  COUNT(*) OVER() YourRowcount , 
        COUNT(*) OVER(Partition BY YourColumnofGroup) YourDistinctCount --Basic of the distinct count
FROM Yourtable

新更新

select top 1 
       COUNT(*) OVER() YourRowcount, 
       DENSE_RANK()  OVER(ORDER BY YourColumn) YourDistinctCount 
FROM Yourtable ORDER BY TT DESC

注意:这段代码是用sql server写的。请检查代码并告诉我。

【讨论】:

  • 不,我不需要窗口功能。我只是想获得行数和不同的行数。
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
相关资源
最近更新 更多