SQL - Как убрать из итога то, что уже подсчитано - PullRequest
2 голосов
/ 26 сентября 2019

Я прошу вашей помощи

здесь это мой набор

        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

, как вы можете видеть:

  • 16/09/2019 есть9 человек, которые ответили
  • 17/09/2019, есть 7 человек, которые ответили
  • 18/09/2019, есть 4 человек, которые ответили
  • 19/09/2019 там4 человека ответили
  • еще 20 человек не ответили

, чтобы подсчитать, сколько людей ответили в день, я сделал:

nb_anseded = 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.

Как я могу это сделать: каждый день я удаляю изИтого, номер, на который уже ответили

Есть ли у вас какие-либо предложения?

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Другим вариантом может быть коррелированный подзапрос в операторе 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>
1 голос
/ 26 сентября 2019

Вы хотите вычесть общее количество из совокупного числа:

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;
...