避免重复计算 - 只计算 table 中的第一次出现

Avoid double counting - only count first occurrence in table

我正在尝试按月计算库存中出现的商品总数(序列号)。

这通常可以用 distinct 轻松解决,但是,我只想计算它是否是第一次出现(第一次插入)。

这个查询让我了解了大部分内容。

select date_trunc (‘month’,date) as Date,productid, count(distinct serialnumber) from inventory
where date_trunc(‘month’,date)>= ‘2016-01-01’ and productID in ('1','2') and status = ‘INSERT’
group by date_trunc(‘month’,date), productid
order by date_trunc(‘month’,date) desc

但我意识到我正在 double/triple/quadruple 计算一些序列号,因为一件物品在其生命周期中可能会多次重新出现在我们的库存中。

上面的查询涵盖了这些场景,因为序列号只出现一次:

以下是我意识到我可能正在 double/triple/quadruple 计数的用例:

这是我 运行 的一个例子。

(注意:我添加了条件列以更好地说明这一点)。但特定序列号已入库三次(第一次是新的,然后是两次使用过的)

Date ProductID Count Condition
7-1-21 1 1 u
11-1-18 1 1 u
2-1-17 1 1 n

在我当前的查询结果中,每次插入都会被计算在内(2017 年 2 月一次,2018 年 11 月一次,2021 年 7 月一次)。

我如何修改我的查询以确保我只计算第一个实例(插入)特定序列号出现在库存中 table?

在子查询中,使用 min 聚合函数仅计算每个 product/item 的首次插入日期。然后计算该结果的项目:

select Date, productid, count(serialnumber)
from (
    select min(date_trunc(‘month’,date)) as Date, productid, serialnumber
    from inventory
    where date_trunc(‘month’,date) >= ‘2016-01-01’
    and productID in ('1','2')
    and status = ‘INSERT’
    group by productid, serialnumber
) x
group by Date, productid
order by Date desc;