none
Mükerrer Kayıt Getirme RRS feed

  • Soru

  • Merhaba Arkadaşlar,

    aşağıdaki tablodaki kayıtları stok kodu tekil olmak üzere fid tarihine göre getirmeye çalışıyorum olmadı yardımcı olur musunuz, sorgum aşağıdadır.

    WITH CTE AS
    (
    SELECT fid_stok_kod, fid_depo_no,fid_eskifiy_tutar,fid_yenifiy_tutar,fid_tarih,fid_create_date FROM 
    STOK_FIYAT_DEGISIKLIKLERI where fid_tarih<='2016-10-10' ) SELECT fid_stok_kod, fid_depo_no,fid_eskifiy_tutar,fid_yenifiy_tutar,fid_tarih,fid_create_date FROM CTE

    10 Ekim 2016 Pazartesi 11:33

Yanıtlar

  • Ne sordugun anlasilmiyor, son fiyat degisikligi olan satirlari mi getirmek istiyorsun? Eger oyleyse:

    with son (stokKod, sonTarih) as ( select fid_stok_kod, max(fid_tarih) from STOK_FIYAT_DEGISIKLIKLERI where fid_tarih < '20161010'
    group by fid_stok_kod

    ) select sfd.* from STOK_FIYAT_DEGISIKLIKLERI sfd inner join son s on s.stokKod = sfd.fid_stok_kod and sfd.fid_tarih = s.sonTarih;




    • Düzenleyen CetinBasoz 10 Ekim 2016 Pazartesi 14:49
    • Yanıt Olarak İşaretleyen csharpp 14 Ekim 2016 Cuma 11:50
    10 Ekim 2016 Pazartesi 11:57
  • Eğer doğru anladıysam fid_stok_kod kolonunda tekrar eden kayıtlar var ve bu kayıtların en son tarihte olanını (fid_tarih kolonuna göre) getirmek istiyorsunuz :) Doğru mudur?

    İsteğiniz buysa aşağıdaki kodu kullanabilirsiniz:

    WITH CTE
    AS
    (
    SELECT fid_stok_kod, fid_depo_no,fid_eskifiy_tutar,fid_yenifiy_tutar,fid_tarih,fid_create_date,
    	ROW_NUMBER() OVER (partition by fid_stok_kod order by fid_tarih desc)  as SiraNo
    FROM STOK_FIYAT_DEGISIKLIKLERI
    WHERE fid_tarih<='2016-10-10'
    )
    SELECT  fid_stok_kod, fid_depo_no,fid_eskifiy_tutar,fid_yenifiy_tutar,fid_tarih,fid_create_date FROM CTE
    WHERE SiraNo = 1
    Umarım faydalı olur...


    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    • Yanıt Olarak İşaretleyen csharpp 14 Ekim 2016 Cuma 11:50
    10 Ekim 2016 Pazartesi 13:37

Tüm Yanıtlar

  • Ne sordugun anlasilmiyor, son fiyat degisikligi olan satirlari mi getirmek istiyorsun? Eger oyleyse:

    with son (stokKod, sonTarih) as ( select fid_stok_kod, max(fid_tarih) from STOK_FIYAT_DEGISIKLIKLERI where fid_tarih < '20161010'
    group by fid_stok_kod

    ) select sfd.* from STOK_FIYAT_DEGISIKLIKLERI sfd inner join son s on s.stokKod = sfd.fid_stok_kod and sfd.fid_tarih = s.sonTarih;




    • Düzenleyen CetinBasoz 10 Ekim 2016 Pazartesi 14:49
    • Yanıt Olarak İşaretleyen csharpp 14 Ekim 2016 Cuma 11:50
    10 Ekim 2016 Pazartesi 11:57
  • Eğer doğru anladıysam fid_stok_kod kolonunda tekrar eden kayıtlar var ve bu kayıtların en son tarihte olanını (fid_tarih kolonuna göre) getirmek istiyorsunuz :) Doğru mudur?

    İsteğiniz buysa aşağıdaki kodu kullanabilirsiniz:

    WITH CTE
    AS
    (
    SELECT fid_stok_kod, fid_depo_no,fid_eskifiy_tutar,fid_yenifiy_tutar,fid_tarih,fid_create_date,
    	ROW_NUMBER() OVER (partition by fid_stok_kod order by fid_tarih desc)  as SiraNo
    FROM STOK_FIYAT_DEGISIKLIKLERI
    WHERE fid_tarih<='2016-10-10'
    )
    SELECT  fid_stok_kod, fid_depo_no,fid_eskifiy_tutar,fid_yenifiy_tutar,fid_tarih,fid_create_date FROM CTE
    WHERE SiraNo = 1
    Umarım faydalı olur...


    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    • Yanıt Olarak İşaretleyen csharpp 14 Ekim 2016 Cuma 11:50
    10 Ekim 2016 Pazartesi 13:37
  • Eğer doğru anladıysam fid_stok_kod kolonunda tekrar eden kayıtlar var ve bu kayıtların en son tarihte olanını (fid_tarih kolonuna göre) getirmek istiyorsunuz :) Doğru mudur?

    İsteğiniz buysa aşağıdaki kodu kullanabilirsiniz:

    WITH CTE
    AS
    (
    SELECT fid_stok_kod, fid_depo_no,fid_eskifiy_tutar,fid_yenifiy_tutar,fid_tarih,fid_create_date,
    	ROW_NUMBER() OVER (partition by fid_stok_kod order by fid_tarih desc)  as SiraNo
    FROM STOK_FIYAT_DEGISIKLIKLERI
    WHERE fid_tarih<='2016-10-10'
    )
    SELECT  fid_stok_kod, fid_depo_no,fid_eskifiy_tutar,fid_yenifiy_tutar,fid_tarih,fid_create_date FROM CTE
    WHERE SiraNo = 1
    Umarım faydalı olur...


    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    Ayni seyi anladik sanirim. Ufak bir not. Row_Number() yaklasimi cekici gorunse de, benim testlerimde cok yavas -max() ile gruplamaya kiyasla 3-4 kez-  kaliyordu  (belki de testler yanlistir).
    10 Ekim 2016 Pazartesi 14:54
  • Doğrudur abdullah abi
    11 Ekim 2016 Salı 06:33
  • Çetin abi doğrudur abi fakat şu var aynı tarihte fiyat değişikliği var ise iki stok kodu birden geliyor istediğim stok kodu tek ve fid tarihi en son  tarih olmak üzere olacak belki de tarih bu şekilde olduğundan dır 2016-10-10 00:00:00.000 öyle de olsa teke düşürmeliyim son kayıt id ye göre, bu arada çetin abi kodun yavaşlağını nasıl test edebiliriz.
    • Düzenleyen csharpp 11 Ekim 2016 Salı 06:39
    11 Ekim 2016 Salı 06:37
  • O zaman top 1 komutu ekle

    kdrgny@outlook.com

    11 Ekim 2016 Salı 07:01
  • Kayıt sayınız ne kadar ya da ne kadar olacak bilmiyorum ama şöyle de olabilir.

    select * from STOK_FIYAT_DEGISIKLIKLERI where fid_create_date in (select max(fid_create_date) from STOK_FIYAT_DEGISIKLIKLERI group by fid_stok_kod)


    http://pgnchess.com
    http://dergikapaklari.com

    11 Ekim 2016 Salı 07:12
  • Haklısınız Çetin hocam. Sadece group by ve max ile yapmak en hızlı çözümü verecektir. Sadece en son tarihi değil de son 2 veya daha fazla tarihi alma ihtimali olursa diye Row_Number() kullanarak yanıt vermiştim. Malum sadece where kısmındaki filtre şartını değiştirmesi yeterli olur diye... Teşekkürler...

    Please Mark This As Answer if it solved your issue
    Please Vote This As Helpful if it helps to solve your issue
    www.abdullahaltintas.com

    11 Ekim 2016 Salı 07:20
  • Çetin abi doğrudur abi fakat şu var aynı tarihte fiyat değişikliği var ise iki stok kodu birden geliyor istediğim stok kodu tek ve fid tarihi en son  tarih olmak üzere olacak belki de tarih bu şekilde olduğundan dır 2016-10-10 00:00:00.000 öyle de olsa teke düşürmeliyim son kayıt id ye göre, bu arada çetin abi kodun yavaşlağını nasıl test edebiliriz.

    Hata senin tablo tasariminda. Sadece bu kolonlar varsa, ve/veya tarih alaninda saat kismini kullanmiyorsan zaten en son hangisi bilmenin bir yolu yok. Birden fazla varken, sen sadece birini alirsan (ornegin top ya da row_number() kullanarak) aldigin kayit son kayit degil (neye gore son?) sansina secilen kayit olacaktir. Ornegin ayni gun 10 ve 20 diye iki fiyat kaydettiysen artik sansina ya 10 ya da 20 alirsin. Ayni gun icin sorguda bir gun 10, baska bir gun 20 alabilirsin. Sans.

    Su anki tablo yapilarinla, yapmanin tek yolu isin icine fid_create_date'i sokmak gibi. Eger o kolon gercekten "son kaydi" verebilecekse olur. Ornegin:

    ST_2 icin 2016/10/10'da ben iki tane fid_create_date goruyorum (2016/10/8 15:38'de ve 2016/10/10 13:20'de). Birisinde 6.99'dan 9 digerinde 2.75'den 3'e cikmis (herhalde fiyatlar uydurma). Bu veriye gore en son degisiklik 2.75'den 3'e (2016/10/10 13:20) diyebiliyorsan:

    WITH    sonlar ( stokKod, tarih )
              AS ( SELECT   fid_stok_kod ,
                            MAX(fid_tarih)
                   FROM     STOK_FIYAT_DEGISIKLIKLERI
                   WHERE    fid_tarih < '20161010'
                   GROUP BY fid_stok_kod
                 ),
            son ( stokKod, tarih, created )
              AS ( SELECT   sd.fid_stok_kod ,
                            sd.fid_tarih ,
                            MAX(sd.fid_create_date)
                   FROM     sonlar
                            INNER JOIN STOK_FIYAT_DEGISIKLIKLERI sd ON sd.fid_stok_kod = sonlar.stokKod
                                               AND sd.fid_tarih = sonlar.tarih
                   GROUP BY sd.fid_stok_kod ,sd.fid_tarih
                 )
        SELECT  sfd.*
        FROM STOK_FIYAT_DEGISIKLIKLERI sfd
                INNER JOIN son s ON sfd.fid_stok_kod = s.stokKod
                                    AND sfd.fid_tarih = s.tarih
                                    AND sfd.fid_create_date = s.created;

    Not: Kod hizini test etmek icin 5-10 milyon kayitli test tablolari olusturup degisik index ve sorgularla calistirirsin, 'execution plan' ve 'client statistics'i incelersin (postgreSQL olsa daha kolay, bir explain analyse der gecersin).

    Not: Deneyip eklemedim ama muhtemelen bir cross apply yontemi en hizlisi olacaktir.

    Not2: Meraktan 10 milyon kayitla denedim. Hayali olarak 200 stokkodu ve rastgele sayida fiyat guncellemesi vardi (asiri yogun). Diger yontemlerle yavas iken (row_number() ile 5 milyon kayitta 11-12sn, yukaridaki ile 3-4sn)  cross apply ile 10 milyon kayitta 13 milisaniye.
    11 Ekim 2016 Salı 12:35
  • O zaman top 1 komutu ekle

    kdrgny@outlook.com

    Yukarida acikladim, top 1 olmaz (yani sansa bagli olur).
    11 Ekim 2016 Salı 12:37
  • Yardımlarınız için çok teşekkür ederim.
    14 Ekim 2016 Cuma 11:50