Merhaba,
Row_Number() analitik fonksiyonu ile select cümleciğimiz içinde order by kullanarak istediğimiz sıradaki satırları başından itibaren 1..2..3 diye numaralandırabiliriz.
OVER (PARTITION BY …) ile neye göre gruplayacağımızı belirterek GROUP BY kullanmadan neye göre sıralama yaptıracağımızı belirtebiliriz.
SELECT ROW_NUMBER() OVER (PARTITION BY MATERIAL ORDER BY CREATEDAT) AS BB, MATERIAL,MATGRP,CREATEDBY,CREATEDAT,CHANGEDAT FROM tablename V WHERE COMPANY = '01' AND ISDELETE = 0 AND MATERIAL IN ( SELECT MATERIAL FROM tablename WHERE COMPANY = '01' AND ISDELETE = 0 GROUP BY MATERIAL HAVING COUNT(MATERIAL) > 1 ) ORDER BY V.MATERIAL )
materyal kolonuna göre gruplayıp numaralandırma işlemini BB kolonu ile yapmış oluruz böylelikle, sıralamayı da oluşturma zamanına göre ayarlarız..
Bu durumda sonuç ekranında, yukarıdaki gibi oluşturulma zamanlarına göre sıralanmış ve materyallere göre gruplanmış halde satır id si verilmiş datalara ulaşırız..
Bu aşamadan sonra datayı oracle’da koleksiyon halinde alıp (sql server’da ;WITH ile CTE oluşturmak gibi) veri kümesi içinde dönerek row id ye göre işlemimizi yaptırabiliriz.
BEGIN FOR COLLECTION IN ( SELECT ROW_NUMBER() OVER (PARTITION BY MATERIAL ORDER BY CREATEDAT) AS BB, MATERIAL,MATGRP,CREATEDBY,CREATEDAT,CHANGEDAT FROM tablename V WHERE COMPANY = '01' AND ISDELETE = 0 AND MATERIAL IN ( SELECT MATERIAL FROM tablename WHERE COMPANY = '01' AND ISDELETE = 0 GROUP BY MATERIAL HAVING COUNT(MATERIAL) > 1 ) ORDER BY V.MATERIAL ) LOOP IF COLLECTION.BB = 1 THEN UPDATE tablename SET CREATEDBY = COLLECTION.CREATEDBY, CREATEDAT = COLLECTION.CREATEDAT WHERE MATERIAL = COLLECTION.MATERIAL AND ISDELETE = 0; END IF; END LOOP; END;
Örnek olarak kodda rowid’si 1 olanlar için bir güncelleme işlemi yaptırıyoruz..