我正在使用oracle DB。我有一个汇总脚本。我们发现表中的某些行是重复的,不需要的,因此不应在总和中添加。
现在假设我在select语句之后使用Distinct命令,将在聚合之前或之后应用distinct命令。
答案 0 :(得分:0)
如果使用SELECT DISTINCT
,则结果集将没有重复的行。
如果使用SELECT COUNT(DISTINCT)
,则该计数将仅计数不同的值。
如果您正在考虑使用SUM(DISTINCT)
(或将DISTINCT
与其他任何聚合函数一起使用),请注意。我从未使用过它(也许只是作为示例),并且我编写了很多查询。
您真的需要从根本上解决问题。例如,如果要重复帐户,则SUM(DISTINCT)
不会仅根据分配给该帐户的值来区分两个帐户。您需要弄清楚逻辑。
答案 1 :(得分: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))
然后,您必须决定如何处理问题。我建议清理并向表中添加唯一约束。
您提到的汇总查询将针对表中的行成功运行,而这些表中的行不具有需要唯一的列组合的重复值。在我的示例中,您可以使用具有倒置的谓词获取该部分数据的汇总。
应该是这样
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))
如果必须包括打破唯一性期望的组,则必须以某种方式对组中要使用的哪个变体进行合格选择-例如,如果应该出现一个列,则可以选择最后一个或第一个表达有关何时创建行的信息。