środa, 5 czerwca 2013

Postgresql ROWNUM


http://explainextended.com/2009/05/05/postgresql-row-numbers/

select max(e.jednostka) as jednostka,
--       e.id_klienta,
       e.modulo, 
       e.konto,
       max(case e.rownum when 1 then e.wlasc end)        as wlasc_id,
       max(case e.rownum when 1 then e.typ_formatki end) as wlasc_f,
       max(case e.rownum when 1 then e.nazwa end)        as wlasc_nazwa,      


       max(case e.rownum when 1 then e.ulica end)        as wlasc_ulica,      
       max(case e.rownum when 1 then e.kod   end)        as wlasc_kod,                    
       max(case e.rownum when 1 then e.miejscowosc  end) as wlasc_miejscowosc,       
       max(case e.rownum when 2 then e.wlasc end)        as ww1_id,       
       max(case e.rownum when 2 then e.typ_formatki end) as ww1_f,
       max(case e.rownum when 2 then e.nazwa end)        as ww1_nazwa,      
       max(case e.rownum when 2 then e.ulica end)        as ww1_ulica,      
       max(case e.rownum when 2 then e.kod   end)        as ww1_kod,
       max(case e.rownum when 2 then e.miejscowosc  end) as ww1_miejscowosc,              
       max(case e.rownum when 3 then e.wlasc end)        as ww2_id,              
       max(case e.rownum when 3 then e.typ_formatki end) as ww2_f,
       max(case e.rownum when 3 then e.nazwa end)        as ww2_nazwa,      
       max(case e.rownum when 3 then e.ulica end)        as ww2_ulica,      
       max(case e.rownum when 3 then e.kod   end)        as ww2_kod,
       max(case e.rownum when 3 then e.miejscowosc  end) as ww2_miejscowosc,                     
       max(case e.rownum when 4 then e.wlasc end)        as ww3_id,              
       max(case e.rownum when 4 then e.typ_formatki end) as ww3_f,
       max(case e.rownum when 4 then e.nazwa end)        as ww3_nazwa,      
       max(case e.rownum when 4 then e.ulica end)        as ww3_ulica,      
       max(case e.rownum when 4 then e.kod   end)        as ww3_kod,
       max(case e.rownum when 4 then e.miejscowosc  end) as ww3_miejscowosc,                     
       max(case e.rownum when 5 then e.wlasc end)        as ww4_id,              
       max(case e.rownum when 5 then e.typ_formatki end) as ww4_f,
       max(case e.rownum when 5 then e.nazwa end)        as ww4_nazwa,      
       max(case e.rownum when 5 then e.ulica end)        as ww4_ulica,      
       max(case e.rownum when 5 then e.kod   end)        as ww4_kod,
       max(case e.rownum when 5 then e.miejscowosc  end) as ww4_miejscowosc
  from (
        select d.*,
               o.nazwa as jednostka,
               k.typ_formatki,
               case k.typ_formatki
                 when 'F' then k.nazwa_pelna
                 when 'G' then k.nazwa_pelna         
                 when 'O' then coalesce(k.nazwisko,'')||' '||coalesce(k.imie_1,'')
               END  as nazwa,
               case when (coalesce(k.adk_ulica,'')||coalesce(k.adk_miejscowosc,'')) <> (coalesce(k.adr_ulica,'')||coalesce(k.adr_miejscowosc,''))
                 then coalesce(k.adk_ulica,'')||' '||coalesce(k.adk_reszta,'')
                 else coalesce(k.adr_ulica,'')||' '||coalesce(k.adr_reszta,'')
               end as ulica,
               case when (coalesce(k.adk_ulica,'')||coalesce(k.adk_miejscowosc,'')) <> (coalesce(k.adr_ulica,'')||coalesce(k.adr_miejscowosc,''))
                 then coalesce(k.adk_kod_pocztowy,'')
                 else coalesce(k.adr_kod_pocztowy,'')
               end as kod,
               case when (coalesce(k.adk_ulica,'')||coalesce(k.adk_miejscowosc,'')) <> (coalesce(k.adr_ulica,'')||coalesce(k.adr_miejscowosc,''))
                 then coalesce(k.adk_miejscowosc,'')
                 else coalesce(k.adr_miejscowosc,'')
               end as miejscowosc

          from (
                select rownum, 
                       (w).id_klienta,
                       (w).modulo,
                       (w).id_modulo,
                       (w).konto, 
                       (w).wlasc[ROWNUM]
                 from (
                      select w, generate_series(1, array_upper(w.wlasc, 1)) AS ROWNUM
                        from (
                             select a.id_klienta,
                                    a.konto,
                                    a.modulo,
                                    a.id_modulo,
                                    a.id_klienta||array(select ta.id_nazwiska 
                                                     from smok.transakcje_atr ta 
                                                    where ta.nazwa like 'Wsp__w_a_ciciel' 
                                                      and ta.id_transakcji = a.id_transakcji
                                                    union -- UNIQUE
                                                   select ma.id_nazwiska
                                                     from smok.modula_atr ma
                                                    where ma.nazwa like 'Wsp__w_a_ciciel' 
                                                      and ma.id_modulo = a.id_modulo) as wlasc
                               from smok.analityka a 
                                    left outer join smok.transakcje t on (t.id_transakcji = a.id_transakcji)
                              where (-- KONTA DO WLACZENIA
                                        a.konto like '2%'
                                     /*or a.konto like 'xx%'*/
                                     )
                            and not (-- KONTA DO WYLACZENIA   
                                        a.konto like '__9%'
                                     /*or a.konto like 'xx%'*/
                                     )
                                 and (t.status = 4 
                                      or (t.status is null and a.data_usuniecia is NULL and a.data_skr is null)
                                     )
/*                                 and a.id_klienta =     68432007
                                 and a.konto like '20064%'                                     
*/                              ) as w
                       ) q
                 ) d 
           join smok.klienci  k on (k.id_klienta      = d.wlasc)         
           join smok.modula   m on (m.id_modulo       = d.id_modulo)
           join  app.oddzialy o on (o.nr_jednostki = m.id_jednostki)
        )e

  group by e.id_klienta, e.modulo, e.konto

Brak komentarzy:

Prześlij komentarz

Ginekolog dr n. med. Piotr Siwek

Gabinet ginekologiczny specjalista ginekolog - położnik dr n. med. Piotr Siwek