none
Tablo daki değerler ardışık mı? RRS feed

  • Soru

  • Merhaba;

    Tablomda şu şekilde veriler var

    TABLE_NO

    10

    11

    12

    Ben bu değerlerin ardışık olup olmadığını anlamak istiyorum mesela yukardaki gibi ise true ama ardışık değilse false dönmesini istiyorum.Nasıl yapabilirim?

    17 Şubat 2016 Çarşamba 09:37

Yanıtlar

  • Kodu calistirmayi deneseydin bunu soylemeden once, ben senin icin 3,5,7 olarak yaptim bak ne cikti:

    DECLARE @dummy TABLE
      (
        tabloID INT IDENTITY
               PRIMARY KEY ,
        deger int
      );
    
    INSERT  @dummy ( [deger] )
    VALUES  ( 3 ),
            ( 5 ),
            ( 7 );
    
    SELECT  CASE WHEN MAX(deger) - MIN(deger) + 1 = COUNT(*) THEN 1
                 ELSE 0
            END AS ardisik
    FROM    @dummy;
    Sonuc: Ardisik - 0

    Not: Sen deseydin ki, mevcut degerler 3,3,5, o zaman hakli olurdun. O zamanda tum yapman gereken setini distinct ile kullanmak.
    • Düzenleyen CetinBasoz 17 Şubat 2016 Çarşamba 13:07
    • Yanıt Olarak İşaretleyen Serkan Canseven 18 Şubat 2016 Perşembe 08:26
    17 Şubat 2016 Çarşamba 13:05

Tüm Yanıtlar

    • ilk Id yi al,
    • son Id yi al
    • aradaki farkı bul 1 ekle (son - ilk +1 = aradaki satır sayısı) 
    • Count ile satır sayısını al.
    • Bunları karşılaştır.

    Örneğin : 

    With 
      ilk AS 
      (
        Select Top 1 Id AS ilkId From TabloAdı
      ),
      son AS
      (
        Select Top 1 Id AS sonId From TabloAdı Order By Id Desc
      ) 
    Select Top 1 (son.sonId - ilk.ilkId + 1) AS Fark, Count(Icons.Id) AS Satır From TabloAdı, ilk, son Group By ilkId, sonId

    Not : Daha güzel tekniklerle bulunabiliyor mu bilmiyorum.


    Herkes mevcut projesi bitince daha iyi ve güvenli kod yazmaya başlayacakmış. Hazır olun Türkiye'de yazılım çağ atlamak üzere

    17 Şubat 2016 Çarşamba 10:40
  • Başıma kötü bir şey gelmeyecekse sormak istiyorum. SQL kodu mu lazım?

    -

    17 Şubat 2016 Çarşamba 10:52
  • @olcay, [1, 5,  3] gibi durumlarda çok işe yaramaz gibi ?

    En az biri bozuyor mu diye bakıyorsan ardışık olmayan ilkini buluncaya kadar dönmekten başka çözüm göremiyorum.

    @fibonecci1 Veritabanını söylemediğin için örnek sorgu yazamıyorum. MSSQL 2012  ve üzeri kullanıyorsan LAG OVER ı araştırmalısın.

    17 Şubat 2016 Çarşamba 10:55
  • Haklısın, Id otomatik artan değilse, manuel giriliyorsa yanlış çalışabilir. Dediğim gibi daha güzel bir tekniği olduğunu bilmediğimden bu tür bir kod yazdım. Hatta şu itirafı da yapabilirim : Sorudaki TABLE_NO yu Primary Key alanını kastediyor diye algılamıştım ama şimdi tekrar okuyunca in türü bir alan sanırım. Bu durumda yanlış çalışma ihtimali artıyor sanırım :)

    Herkes mevcut projesi bitince daha iyi ve güvenli kod yazmaya başlayacakmış. Hazır olun Türkiye'de yazılım çağ atlamak üzere

    17 Şubat 2016 Çarşamba 11:02
  • Bunun anlayinca ne olacak onu da dusun :)

    SELECT  CASE WHEN MAX(table_no) - MIN(table_no) + 1 = COUNT(*) THEN 1
                 ELSE 0
            END AS ardisik
    FROM    tabloAdi;
    

    17 Şubat 2016 Çarşamba 11:11
  • @Soner,

    SQL varken baska ne lazim ki bunun icin :)

    17 Şubat 2016 Çarşamba 11:12
  • SELECT  CASE WHEN MAX(table_no) - MIN(table_no) + 1 = COUNT(*) THEN 1
                 ELSE 0
            END AS ardisik
    FROM    tabloAdi;


    Merhaba aslında yukardaki dediğiniz şekilde yaparsam bütün ardışıkları kapsar fakat ben

    tablomdaki değerler eğer 1 er 1 er artıyorsa true dönecektir.

    mesela 3,5,7 ise ;1 er 1 er artmadığı için false döndüreceğim

    manuel bir giriş yok ,primary alan da değil..normal column değeri



    • Düzenleyen fibonecci1 17 Şubat 2016 Çarşamba 12:15
    17 Şubat 2016 Çarşamba 12:07
  • Ne istedigini benim anlayabilecegim bir dilde anlatirsan bakariz :) En iyisi (kod seklinde) ornek veri ve sonucta ne bekledigini vermen.
    17 Şubat 2016 Çarşamba 12:33
  • @Soner,

    SQL varken baska ne lazim ki bunun icin :)

    :) Bazen Linq de kastediliyor. Fırça yemek istemiyorum arkadaşlardan.

    -

    17 Şubat 2016 Çarşamba 12:34
  • Ne istedigini benim anlayabilecegim bir dilde anlatirsan bakariz :) En iyisi (kod seklinde) ornek veri ve sonucta ne bekledigini vermen.
         tabloID        deger
    1 100
    2 101
    3 102

    yukarıdaki gibi bir tablom var; deger alanı 1 er 1 er artarsa true döndersin, değilse false döndersin



    17 Şubat 2016 Çarşamba 12:40
  • @olcay, [1, 5,  3] gibi durumlarda çok işe yaramaz gibi ?

    En az biri bozuyor mu diye bakıyorsan ardışık olmayan ilkini buluncaya kadar dönmekten başka çözüm göremiyorum.

    @fibonecci1 Veritabanını söylemediğin için örnek sorgu yazamıyorum. MSSQL 2012  ve üzeri kullanıyorsan LAG OVER ı araştırmalısın.

    LAG OVER aslında oldukça yararlı bir kullanım ama burda nasıl işimize yarar bilemiyorum
    17 Şubat 2016 Çarşamba 12:46
  • Iyi de burada benim yazdigimdan farkli olan ne? Sadece Table_No yerine Deger diye kolon adi, oyle degil mi?

    DECLARE @dummy TABLE
      (
        tabloID INT IDENTITY
               PRIMARY KEY ,
        deger int
      );
    
    INSERT  @dummy ( [deger] )
    VALUES  ( 100 ),
            ( 101 ),
            ( 102 );
    
    SELECT  CASE WHEN MAX(deger) - MIN(deger) + 1 = COUNT(*) THEN 1
                 ELSE 0
            END AS ardisik
    FROM    @dummy;
    
    Update  @dummy SET [deger] = 103 WHERE  deger = 102;
    
    SELECT  CASE WHEN MAX(deger) - MIN(deger) + 1 = COUNT(*) THEN 1
                 ELSE 0
            END AS ardisik
    FROM    @dummy;
    

    Not: Hala olmadiysa, sen de ne istedigini kod ile ver lutfen. Oturup benim yazmam gerekmesin ornegi.

    17 Şubat 2016 Çarşamba 12:53
  • 7-3 = 4

    4 +1 = 5

    count(*) = 3

    3 != 5


    Herkes mevcut projesi bitince daha iyi ve güvenli kod yazmaya başlayacakmış. Hazır olun Türkiye'de yazılım çağ atlamak üzere

    17 Şubat 2016 Çarşamba 13:00
  • Konu efsane konular olma yolunda hızla ilerliyor. :)

    -

    17 Şubat 2016 Çarşamba 13:01
  • 7-3 = 4

    4 +1 = 5

    count(*) = 3

    3 != 5


    Herkes mevcut projesi bitince daha iyi ve güvenli kod yazmaya başlayacakmış. Hazır olun Türkiye'de yazılım çağ atlamak üzere

    Teşekkür ederim, bir an farklı düşündüm..dediğiniz gibi sadece 1 er 1 er artarsa işe yarıyor
    • Düzenleyen fibonecci1 17 Şubat 2016 Çarşamba 13:04
    17 Şubat 2016 Çarşamba 13:04
  • Kodu calistirmayi deneseydin bunu soylemeden once, ben senin icin 3,5,7 olarak yaptim bak ne cikti:

    DECLARE @dummy TABLE
      (
        tabloID INT IDENTITY
               PRIMARY KEY ,
        deger int
      );
    
    INSERT  @dummy ( [deger] )
    VALUES  ( 3 ),
            ( 5 ),
            ( 7 );
    
    SELECT  CASE WHEN MAX(deger) - MIN(deger) + 1 = COUNT(*) THEN 1
                 ELSE 0
            END AS ardisik
    FROM    @dummy;
    Sonuc: Ardisik - 0

    Not: Sen deseydin ki, mevcut degerler 3,3,5, o zaman hakli olurdun. O zamanda tum yapman gereken setini distinct ile kullanmak.
    • Düzenleyen CetinBasoz 17 Şubat 2016 Çarşamba 13:07
    • Yanıt Olarak İşaretleyen Serkan Canseven 18 Şubat 2016 Perşembe 08:26
    17 Şubat 2016 Çarşamba 13:05
  • 7-3 = 4

    4 +1 = 5

    count(*) = 3

    3 != 5


    Herkes mevcut projesi bitince daha iyi ve güvenli kod yazmaya başlayacakmış. Hazır olun Türkiye'de yazılım çağ atlamak üzere

    Teşekkür ederim, bir an farklı düşündüm..dediğiniz gibi sadece 1 er 1 er artarsa işe yarıyorum
    Esta'ğfurullah, bir insan her zaman işe yarar.

    Herkes mevcut projesi bitince daha iyi ve güvenli kod yazmaya başlayacakmış. Hazır olun Türkiye'de yazılım çağ atlamak üzere

    17 Şubat 2016 Çarşamba 13:06