Повторите значение для нескольких строк - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть список значений, и я должен отобразить материнское значение CHILDVALUE следующим образом. MOTHERVALUE должно совпадать с CHILDVALUE при RNO = 1, в противном случае MOTHERVALUE повторяется для последующих строк до тех пор, пока не встретится новая последовательность, начинающаяся с RNO = 1. Вот что я хочу достичь

RNO ChildValue  MotherValue SKIPNO  CREATEDDATE
1   345dg       345dg       4   19/9/2018 2:49
2   342sds      345dg       4   19/9/2018 11:53
.
.
.               
19  343dfd      345dg       4   6/11/2018 12:40
20  234dfs      345dg       4   6/11/2018 14:56
1   545ert      545ert      4   6/11/2018 15:17
2   543tye      545ert      4   7/11/2018 11:29
.
.
.               
9   345cxv      545ert      4   16/11/2018 14:16
1   563mnj      563mnj      5   19/11/2018 2:12

Номера строк генерируются динамически в соответствии с SKIPNO (без различий) и CREATEDDATE. Но у меня проблема с отображением правильного MOTHERVALUE для некоторых строк

Я пробовал приведенный ниже запрос, который наилучшим образом соответствует как минимум 50% требований.

 select RNO
        , CHILDVALUE 
       , case RNO when 1 then CHILDVALUE 
           else lag(MOTHERVALUE) over (order by SKIPNO, CreatedDate ASC) end as MOTHERVALUE
       , SKIPNO, CreatedDate 
from( SELECT (ROW_NUMBER() OVER (PARTITION BY A.SKIPNO
              ORDER BY A.SKIPNO,  A.CreatedDate ASC) RNO
          , A.* 
      from  (select distinct CHILDVALUE
                    , CHILDVALUE as MOTHERVALUE
                    , SKIPNO
                    , CreatedDate 
              from values ) A
          )
      )

Этот запрос частично дает ожидаемый результат, но все еще далек от фактического результата, поскольку показывает правильный MOTHERVALUE only for the first two rows. The query does not help me to show the correct MOTHERVALUE` для более чем второй строки.

Вот мой стол:

   CREATE TABLE VALUES (
      CHILDVALUE VARCHAR2(36), 
      SKIPNO VARCHAR2(36), 
      CREATEDDATE DATE) 

Просьба помочь.

1 Ответ

0 голосов
/ 19 ноября 2018

NB Я предполагаю, что ваши данные выборки имели неправильные пропуски для второй и третьей групп.В моем ответе используются обновленные значения в примерах данных.

Вы можете использовать аналитическую функцию first_value вместо lag для достижения своей цели, например:

WITH vals AS (SELECT '345dg' childvalue, 4 skipno, to_date('19/09/2018 02:49', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
              SELECT '342sds' childvalue, 4 skipno, to_date('19/09/2018 11:53', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
              SELECT '343dfd' childvalue, 4 skipno, to_date('06/11/2018 12:40', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
              SELECT '234dfs' childvalue, 4 skipno, to_date('06/11/2018 14:56', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
              SELECT '545ert' childvalue, 5 skipno, to_date('06/11/2018 15:17', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
              SELECT '543tye' childvalue, 5 skipno, to_date('07/11/2018 11:29', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
              SELECT '345cxv' childvalue, 5 skipno, to_date('16/11/2018 14:16', 'dd/mm/yyyy hh24:mi') createddate FROM dual UNION ALL
              SELECT '563mnj' childvalue, 6 skipno, to_date('19/11/2018 02:12', 'dd/mm/yyyy hh24:mi') createddate FROM dual)
SELECT row_number() OVER (PARTITION BY skipno ORDER BY createddate) rno,
       childvalue,
       first_value(childvalue) OVER (PARTITION BY skipno ORDER BY createddate) mothervlue,
       skipno,
       createddate
FROM   vals;

       RNO CHILDVALUE MOTHERVLUE     SKIPNO CREATEDDATE
---------- ---------- ---------- ---------- -----------
         1 345dg      345dg               4 19/09/2018
         2 342sds     345dg               4 19/09/2018
         3 343dfd     345dg               4 06/11/2018
         4 234dfs     345dg               4 06/11/2018
         1 545ert     545ert              5 06/11/2018
         2 543tye     545ert              5 07/11/2018
         3 345cxv     545ert              5 16/11/2018
         1 563mnj     563mnj              6 19/11/2018
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...