SQL table 中具有不同元素的累积和查询

Cumulative Sum Query in SQL table with distinct elements

我有一个这样的 table,列名称为 销售日期 和保险 销售人员姓名 -

Date of Sale | Salesman Name | Sale Amount
2021-03-01   | Jack          | 40  
2021-03-02   | Mark          | 60
2021-03-03   | Sam           | 30 
2021-03-03   | Mark          | 70 
2021-03-02   | Sam           | 100

我想分组依据,使用销售日期。下一列应显示截至该日期进行销售的卖家的累计数量。但不应再次考虑相同的卖家。

例如, 以下table不正确,

Date of Sale | Count(Salesman Name) | Sum(Sale Amount)
2021-03-01   | 1                    | 40
2021-03-02   | 3                    | 200
2021-03-03   | 5                    | 300  

以下table正确,

Date of Sale | Count(Salesman Name) | Sum(Sale Amount)
2021-03-01   | 1                    | 40
2021-03-02   | 3                    | 200
2021-03-03   | 3                    | 300

我不确定如何构造SQL查询,因为这里涉及两个条件,忽略重复项的累积计数。我认为 OVER 子句和前面的无界行在这里可能会有一些用处?请求你的帮助

编辑 - 我已将销售额添加为一列。我还需要销售额的累计金额。但在这种情况下,应考虑所有销售额,这与仅考虑唯一名称的销售员姓名情况不同。

一种方法使用自连接和聚合:

WITH cte AS (
    SELECT t1.SaleDate,
           COUNT(CASE WHEN t2.Salesman IS NULL THEN 1 END) AS cnt,
           SUM(t1.SaleAmount) AS amt
    FROM yourTable t1
    LEFT JOIN yourTable t2
        ON t2.Salesman = t1.Saleman AND
           t2.SaleDate < t1.SaleDate
    GROUP BY t1.SaleDate
)

SELECT
    SaleDate,
    SUM(cnt) OVER (ORDER BY SaleDate) AS NumSalesman,
    SUM(amt) OVER (ORDER BY SaleDate) AS TotalAmount
FROM cte
ORDER BY SaleDate;

CTE 中的逻辑是,我们尝试为每个销售员查找同一销售员的较早记录。如果我们不能找到这样的记录,那么我们假设有问题的记录是第一次出现。然后我们按日期聚合得到每天的计数,最后在外部查询中对计数进行滚动求和。

执行此操作的最佳方法是使用 window 函数来确定销售人员首次出现的时间。然后,您只需要累计金额:

select saledate,
       sum(case when seqnum = 1 then 1 else 0 end) over (order by saledate) as num_salespersons,
       sum(sum(sales)) over (order by saledate) as running_sales
from (select t.*,
             row_number() over (partition by salesperson order by saledate) as seqnum
      from t
     ) t
group by saledate
order by saledate;

请注意,除了更简洁之外,这应该比使用自连接的解决方案具有更好的性能。