简单 sql over (partition by) 没有按预期工作

simple sql over (partition by) not working as expected

感觉应该很简单,但我脑子一片空白,非常感谢任何帮助!

假设我有这个数据集

Date     sale_id    salesperson Missed_payment_this_month
01/01/2016  1001    John         1
01/01/2016  1002    Bob          0
01/01/2016  1003    Bob          0
01/01/2016  1004    John        N/A
01/02/2016  1001    John         1
01/02/2016  1002    Bob          1
01/02/2016  1003    Bob          0
01/02/2016  1004    John         1
01/03/2016  1001    John         1
01/03/2016  1002    Bob          0
01/03/2016  1003    Bob          0
01/03/2016  1004    John         1    

并想将这两列添加到末尾。他们通过 sales_id 和销售人员查看之前错过的付款次数。

Previous_missed_payment_by_sale_id  Previous_missed_payment_by_sales person
    0                                           0
    0                                           0
    0                                           0
    0                                           0
    1                                           1
    0                                           0
    0                                           0
    0                                           1
    2                                           3
    1                                           1
    0                                           1
    1                                           3

sales_id 没问题,但通过销售人员获取它会给我一个错误(分组依据)或添加额外的列。我需要保持行不变。

我最好的猜测是 returns 额外的列:

 select t1.Date, t1.sale_id, t1.salesperson
 ,sum(case when t2.Missed_payment_this_month = '1' then 1 else 0 end)             previous_missed_sales_id
 ,sum(case when t2.Missed_payment_this_month = '1' then 1 else 0 end) OVER (PARTITION by t1.salesperson) previous_missed_salesperson

 from [dbo].[simple_join_table2] t1
 inner join [dbo].[simple_join_table2] t2 on 
(t2.[Date] < t1.[Date] AND t1.[sale_id] = t2.[sale_id])

 group by t1.Date, t1.sale_id, t1.salesperson
 ,case when t2.Missed_payment_this_month = '1' then 1 else 0 end

这是输出:

Date    sale_id salesperson previous_missed_sales_id    previous_missed_salesperson
01/02/2016  1002    Bob         0                                   1
01/02/2016  1003    Bob         0                                   1
01/03/2016  1002    Bob         0                                   1
01/03/2016  1002    Bob         1                                   1
01/03/2016  1003    Bob         0                                   1
01/02/2016  1001    John        1                                   3
01/02/2016  1004    John        0                                   3
01/03/2016  1001    John        2                                   3
01/03/2016  1004    John        0                                   3
01/03/2016  1004    John        1                                   3

如果没有另一个子查询,这可能吗?我猜另一种说法是我试图模仿 Powerpivot 的 sumx 和早期功能。

如果您在 2012 年以上,请使用 windowing 聚合。 Previous = sum all_previous_including_curret - 当前总和。 sql 女士默认 window 正好是 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

with [simple_join_table2] as(
    -- sample data
    select cast(valuesDate as Date) valuesDate, sale_id, salesperson, Missed_payment_this_month 
    from (
        values
         ('20160101',1001,'John', 1)
        ,('20160101',1002,'Bob ', 0)
        ,('20160101',1003,'Bob ', 0)
        ,('20160101',1004,'John',null)
        ,('20160201',1001,'John', 1)
        ,('20160201',1002,'Bob ', 1)
        ,('20160201',1003,'Bob ', 0)
        ,('20160201',1004,'John', 1)
        ,('20160301',1001,'John', 1)
        ,('20160301',1002,'Bob ', 0)
        ,('20160301',1003,'Bob ', 0)
        ,('20160301',1004,'John', 1)
    ) t(valuesDate, sale_id, salesperson, Missed_payment_this_month)
)
select valuesDate,sale_id, salesperson, Missed_payment_this_month, 
  byidprevmonth = sum(Missed_payment_this_month ) over(partition by sale_id order by valuesDate)
        - sum(Missed_payment_this_month) over(partition by valuesDate, sale_id),
  bypersonprevmonth = sum(Missed_payment_this_month) over(partition by salesperson order by valuesDate) 
        - sum(Missed_payment_this_month) over(partition by valuesDate, salesperson)
from [simple_join_table2] 
order by salesperson, valuesDate