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

Моя процедура хранения:

SELECT B.ETADATE,
  a.NAME,
  a.CATEGORY ,
  a.TYPE,
  a.STOCK
FROM
  (SELECT TO_CHAR(TO_DATE(FROM_DATE,'DD-MM-YYYY HH24:MI:SS')) AS "FROM_DATE",
    NAME                                                      AS "NAME",
    CATEGORY                                                  AS "CATEGORY",
    TYPE                                                      AS "TYPE",
    BALANCE                                                   AS "BALANCE"
  FROM VW_NET_STOCK_POSITION
  ) a,
  (SELECT dt + LEVEL AS ETADate
  FROM
    (SELECT TRUNC (TO_DATE ('01-09-2018 00:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'MM') - 1 AS dt
    FROM DUAL
    ) D
    CONNECT BY LEVEL <= sysdate - dt
  ) B
WHERE a.FROM_DATE(+) = B.ETADATE
ORDER BY ETADate;

и мой вывод:

enter image description here

но я хочу, чтобы значение 'null' затем заменялось предыдущей транзакцией.

Примерно так:

хотите вывод, подобный этому :

enter image description here

Ответы [ 2 ]

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

Не используйте + для внешних соединений!Решение вашей проблемы - LAG(. . . IGNORE NULLS).Но запрос можно очистить.

Я бы предложил написать это как:

WITH dates as (
      SELECT (dt + level - 1) as etadate
      FROM (SELECT TRUNC(DATE '2018-09-01', 'MM') - 1 AS dt
            FROM DUAL
           ) d
      CONNECT BY LEVEL <= sysdate - dt + 1  -- to get today's date
  ) 
SELECT d.etadate,
       COALESCE(nsp.name, LAG(nsp.name IGNORE NULLS) OVER (ORDER BY d.etadate)) as name,
       COALESCE(nsp.category, LAG(nsp.category IGNORE NULLS) OVER (ORDER BY d.etadate)) as category,
       COALESCE(LAG(nsp.type IGNORE NULLS) OVER (ORDER BY d.etadate), type) as type,
       COALESCE(LAG(nsp.stock IGNORE NULLS) OVER (ORDER BY d.etadate), stock) as stock
FROM dates d LEFT JOIN
     VW_NET_STOCK_POSITION nsp
     ON d.etadate = TRUNC(nsp.from_date)
ORDER BY d.ETADate;
0 голосов
/ 20 сентября 2018

Вы можете использовать аналитическую функцию LAST_VALUE с опцией IGNORE NULLS, чтобы сделать SQL следующим образом:

SELECT ETADATE,
       LAST_VALUE(NAME)  IGNORE NULLS OVER (ORDER BY etadate) as NAME, 
       LAST_VALUE(CATEGORY) IGNORE NULLS OVER (ORDER BY etadate) as CATEGORY,
       LAST_VALUE(TYPE) IGNORE NULLS OVER (ORDER BY etadate ) as TYPE,
       LAST_VALUE(BALANCE) IGNORE NULLS OVER (ORDER BY etadate ) as STOCK
  FROM 
    (SELECT TO_CHAR(TO_DATE(FROM_DATE,'DD-MM-YYYY HH24:MI:SS')) AS "FROM_DATE",
      NAME                                                      AS "NAME",
      CATEGORY                                                  AS "CATEGORY",
      TYPE                                                      AS "TYPE",
      BALANCE                                                   AS "BALANCE"
    FROM VW_NET_STOCK_POSITION
    ) a LEFT OUTER JOIN
    (SELECT dt + LEVEL AS ETADate
       FROM
      (SELECT TRUNC (TO_DATE ('01-09-2018 00:00:00', 'DD-MM-YYYY HH24:MI:SS'), 'MM') - 2 
           AS dt
      FROM DUAL
      ) D
      CONNECT BY LEVEL <= trunc(sysdate) - dt
    ) B
   ON ( a.FROM_DATE = B.ETADATE )
ORDER BY ETADate;

и предпочитаете использовать ANSI JOIN стандарт.

Демонстрация SQL Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...