Как создать счетчик дат, в котором нет транзакции, но он будет отображаться с предыдущим счетом - PullRequest
0 голосов
/ 18 сентября 2018

Мой текущий выход:

Current output

Но я хочу поставить как:

want output like

Примечание: Я хочу -> если в какой-то день не было транзакции, эта дата все равно будет отображаться с предыдущим счетчиком. (Из процедуры в oracle)

1 Ответ

0 голосов
/ 18 сентября 2018

вот простое решение, которое может помочь вам:

http://sqlfiddle.com/#!4/ed98d/1/0

with 
full_august as (
    select TO_DATE ('01.AUG.2018 00:00:00', 'DD.MON.YYYY HH24:MI:SS')+level-1 date_ 
    from dual connect by level <= 31),
possible_combinations as (
    select f.date_,t.count_,f.date_-t.date_ currentness 
    from full_august f left outer join t_ t on f.date_ >= t.date_)
select pc.date_,pc.count_ 
from possible_combinations pc
where pc.currentness  = (select min(currentness) from possible_combinations where date_ = pc.date_)
and   pc.date_       <= (select max(date_) from t_);

|      DATE_ | COUNT_ |
|------------|--------|
| 2018-08-18 |    200 |
| 2018-08-19 |    200 |
| 2018-08-20 |    400 |
| 2018-08-21 |    200 |
| 2018-08-22 |    200 |
| 2018-08-23 |    200 |
| 2018-08-24 |    200 |
| 2018-08-25 |    600 |
| 2018-08-26 |    800 |

Некоторая дополнительная информация, запрошенная @dbusern:

  • Вы можете найти структуры таблиц за ссылкой sqlfiddle выше
  • Конструкция connect by - это «Иерархический запрос», очень мощная конструкция. Но его также можно использовать (ab) для простых вещей, таких как select level from dual connect by level <= 10, чтобы просто получить числа от 1 до 10.
  • * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * * * * * * * * * * * * * * * * * * * * * * * * * * *1015* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * left join on f.date_ >= t.date_. * * * * *
  • Затем в части pc.currentness = (select min(currentness)... мы отбрасываем все результаты, которые не являются самыми последними прошлыми результатами
  • Часть pc.date_ <= (select max(date_) просто предназначена для удаления дней, которые превышают максимальную дату в t, так как это казалось требованием
  • Вы можете попробовать каждую часть запроса, добавив выбор между:

    with 
    full_august as (
        select TO_DATE ('01.AUG.2018 00:00:00', 'DD.MON.YYYY HH24:MI:SS')+level-1 date_ 
        from dual connect by level <= 31)
    select * from full_august;
    
    
    with 
    full_august as (
        select TO_DATE ('01.AUG.2018 00:00:00', 'DD.MON.YYYY HH24:MI:SS')+level-1 date_ 
        from dual connect by level <= 31),
    possible_combinations as (
        select f.date_,t.count_,f.date_-t.date_ currentness 
        from full_august f left outer join t_ t on f.date_ >= t.date_)
    select * from possible_combinations;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...