SQL - 如何从总数中删除已计算的内容

SQL - How to remove from the total what has already been counted

我正在请求你的帮助

这是我的套装

        ID date_answered  
---------- -------------- 
         1 16/09/19       
         2 16/09/19       
         3 16/09/19       
         4 16/09/19       
         5 16/09/19       
         6 16/09/19       
         7 16/09/19       
         8 16/09/19       
         9 16/09/19       
        10 17/09/19       
        11 17/09/19       
        12 17/09/19       
        13 18/09/19       
        14 18/09/19       
        15 18/09/19       
        16 18/09/19       
        17 19/09/19       
        18 19/09/19       
        19 19/09/19       
        20 19/09/19
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40

如你所见:

计算每天有多少人回答,我是这样做的:

nb_answered = count(id) over (partition by date_answered order by date_answered)

现在我的问题来了,我正在努力解决这个问题:

date_answered   nb_answered    nb_left  
--------------- -------------- -------- 
16/09/2019           9           40        
17/09/2019           7           31(40-9)  
18/09/2019           4           24(31-7)  
19/09/2019           4           20(24-4)  

我试过了:

count(id) over (order by date_complete rows between UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 给我40(总人数)。

第一次约会很酷,但是当我进入第二次约会时,我不知道如何拥有 31。

我该怎么做:我每天从总数中删除已经回答的人数

你有什么建议吗?

您想从累计计数中减去总计数:

select date_answered, count(*) as answered_on_date,
       ( count(*) over () -
         sum(count(*)) over (order by date_answered nulls last)
       ) as remaining
from t
group by date_answered
order by date_answered;

如果您不想包括当前日期,那么也减去它:

select date_answered, count(*) as answered_on_date,
       ( count(*) over () -
         sum(count(*)) over (order by date_answered nulls last) -
         count(*)
       ) as remaining
from t
group by date_answered
order by date_answered;

另一个选项可能是 SELECT 语句中的相关子查询。

示例有点简化(不想输入那么多)。

SQL> with test (id, da) as
  2    (select 1, 16092019 from dual union all
  3     select 2, 16092019 from dual union all
  4     select 3, 16092019 from dual union all
  5     select 4, 16092019 from dual union all
  6     select 5, 16092019 from dual union all
  7     --
  8     select 6, 17092019 from dual union all
  9     select 7, 17092019 from dual union all
 10     select 8, 17092019 from dual union all
 11     --
 12     select 9, 19092019 from dual union all
 13     --
 14     select 10, null from dual union all
 15     select 11, null from dual union all
 16     select 12, null from dual union all
 17     select 13, null from dual
 18    )
 19  select a.da date_answered,
 20         count(a.id) nb_answered,
 21        (select count(*) from test b
 22         where b.da >= a.da
 23            or b.da is null
 24        ) nb_left
 25  from test a
 26  group by a.da
 27  order by a.da;

DATE_ANSWERED NB_ANSWERED    NB_LEFT
------------- ----------- ----------
     16092019           5         13
     17092019           3          8
     19092019           1          5
                        4          4

SQL>