Rownum для колонны с лагом - PullRequest
       71

Rownum для колонны с лагом

1 голос
/ 19 февраля 2020

У меня есть этот запрос

SELECT CASE WHEN LAG(emp_id) OVER( ORDER BY NULL ) = emp_id THEN '-'
            ELSE  emp_id END "Employee ID",
       row_number() over (partition by emp_id order by emp_id) as "S/N",  
       family_mem_id   "MemID",
       CASE WHEN LAG(emp_id) OVER(ORDER BY NULL ) = emp_id THEN 0 
            ELSE (SUM(amount_paid) OVER(PARTITION BY emp_id)) END "Total amount"
FROM    Employee 
ORDER   BY emp_id;

И он показывает мне результат следующим образом: Resultset

Я хочу добавить номер строки (первый столбец SN) для Employee ID для промежуточных строк. Я хочу установить его как ноль, например, для For Employee ID -> S / N 2-> F904 (SN должен быть нулевым). Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Используйте dense_rank() для перечисления строк:

select case lag(emp_id) over( order by emp_id ) when emp_id then null 
            else '<'||dense_rank() over (order by emp_id)||'>'
       end sn,
       nullif(emp_id, lag(emp_id) over( order by emp_id )) empid,
       row_number() over (partition by emp_id order by emp_id) rn,  
       family_mem_id memid,
       case lag(emp_id) over(order by emp_id) when emp_id then null 
            else (sum(amount_paid) over(partition by emp_id)) 
       end total
  FROM  Employee order by emp_id;

dbfiddle и пример вывода:

SN   EMPID     RN MEMID      TOTAL
---- ----- ------ ----- ----------
<1>  101        1 F901         200
                2 F904  
<2>  102        1 F901         135
                2 F901  
<3>  103        1 F901         185
                2 F901  
                3 F901  
0 голосов
/ 19 февраля 2020

Вы можете использовать внешний запрос для создания столбца SN следующим образом:

SELECT CASE WHEN "S/N" = 1 THEN '<1>' END AS SN, T.* FROM -- added this
(SELECT 
       CASE WHEN LAG(emp_id) OVER( ORDER BY NULL ) = emp_id THEN '-'
            ELSE  emp_id END "Employee ID",
       row_number() over (partition by emp_id order by emp_id) as "S/N",  
       family_mem_id   "MemID",
       CASE WHEN LAG(emp_id) OVER(ORDER BY NULL ) = emp_id THEN 0 
            ELSE (SUM(amount_paid) OVER(PARTITION BY emp_id)) END "Total amount"
FROM    Employee ) T
ORDER BY "Employee ID", "S/N"; -- Added this

Обратите внимание, что я также изменил предложение ORDER BY (которое перемещено во внешний запрос).

Ура !!

...