在聚合选择查询中使用Distinct

问题描述 投票:0回答:2

我正在使用 Oracle DB。我有一个聚合脚本。我们发现表中的某些行是重复的、不需要的,因此不应添加到总和中。

现在假设我在 select 语句之后使用 Distinct 命令,将在聚合之前或之后应用不同的命令。

sql oracle group-by distinct
2个回答
0
投票

如果使用

SELECT DISTINCT
,那么结果集将不会有重复行。

如果您使用

SELECT COUNT(DISTINCT)
,则计数将仅计算不同值。

如果您正在考虑使用

SUM(DISTINCT)
(或
DISTINCT
与任何其他聚合函数),请注意。我从未使用过它(除了作为演示),并且我已经编写了相当多的查询。

确实需要从源头解决问题。例如,如果帐户重复,则

SUM(DISTINCT)
不会区分帐户,仅通过分配给帐户的值来区分。你需要弄清楚逻辑。


0
投票

当你说你有重复的行时 - 你必须清楚地了解某些特定列的组合的唯一性。

如果您期望某些列组合在指定组中是唯一的,则可以使用遵循以下模式的查询来检测与该组合不同的组。

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谓词来获取该部分数据的聚合。

会是这样的

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)) 

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

© www.soinside.com 2019 - 2024. All rights reserved.