oracle 在聚合选择查询中使用Distinct

sigwle7e  于 2022-12-18  发布在  Oracle
关注(0)|答案(2)|浏览(177)

我正在使用oracle数据库。我有一个聚合脚本。我们发现表中的一些行是重复的,不需要的,因此不应该添加到总和中。
现在假设我在select语句之后使用Distinct命令,那么distinct命令是在聚合之前应用还是在聚合之后应用。

roejwanj

roejwanj1#

如果使用SELECT DISTINCT,则结果集将没有重复行。
如果使用SELECT COUNT(DISTINCT),则计数将只计算非重复值。
如果您正在考虑使用SUM(DISTINCT)(或DISTINCT与任何其他聚合函数),请注意,我从未使用过它(除了作为演示),并且我已经编写了相当数量的查询。
你真的需要从源头上解决这个问题。例如,如果账户是重复的,那么SUM(DISTINCT)并不区分账户之间的区别,只通过分配给账户的值。你需要正确的逻辑。

r6hnlfcb

r6hnlfcb2#

当你说你有重复的行时--你必须清楚地知道某些特定列组合的唯一性。
如果您希望某些列组合在指定的组中是唯一的,则可以使用遵循以下模式的查询来检测偏离该组合的组。

select <your group by columns> 
from <your table name> 
group by <your group by predicate>
having (max(A)!=min(A) or max(B)!=min(B) or max(C)!=min(C))

然后你必须决定如何处理这个问题。我建议清理并向表中添加唯一约束。
您提到的聚合查询将成功地运行于表中的行,这些行对于需要唯一的列组合不具有重复值。使用我的示例,您可以使用反向having predicate 来获取该部分数据的聚合。
大概是这样的

select <your aggregate functions, counts, sums, averages and so on> 
from <your table name> 
group by <your group by predicate>
having (max(A)=min(A) and max(B)=min(B) and max(C)=min(C))

如果你必须包含打破唯一性期望的组,你必须以某种方式对要使用的组中的变量进行限定选择--例如,如果你的一列碰巧表达了关于行创建时间的信息,你可以选择最后一个变量或第一个变量。

相关问题