+ Yanıtla
Toplam 9 sonuçtan 1 ile 9 arası olanlar

Konu Başlığı: MySQL'de DateTime içinde günlere göre DISTINCT

  1. #1

    MySQL'de DateTime içinde günlere göre DISTINCT

    MySQL'de db'de DateTime tipinde bir alanım var tarih orada 2009-06-02 20:52:04 şeklinde tutuluyor. Dakikada ortalama 3-5 arasında kayıt ekleniyor bu tabloya; ben yalnızca o gün için kayıt olup olmadığını sorgulamak adına,2009-06-02 (Y-m-d) şeklidekikısmına DISTINCT sorgusunu nasıl uygulayabilirim?

  2. #2
    Kod:
    ...where year(2009) and month(06) and dayofmonth(02)
    

  3. #3
    Alıntı Darksist tarafından gönderilen mesaj: Mesajı Göster
    MySQL'de db'de DateTime tipinde bir alanım var tarih orada 2009-06-02 20:52:04 şeklinde tutuluyor. Dakikada ortalama 3-5 arasında kayıt ekleniyor bu tabloya; ben yalnızca o gün için kayıt olup olmadığını sorgulamak adına,2009-06-02 (Y-m-d) şeklidekikısmına DISTINCT sorgusunu nasıl uygulayabilirim?
    Kod:
    select date_format([tarih kolonu], '%Y-%m-%d'), count(*)
    from [tablo]
    group by DATE_FORMAT([tarih kolonu], '%Y-%m-%d')
    

  4. #4
    @mow malesef bu yardımcı olmadı...

    @bgul tam olarak budur date_formatı kullanıp başına distinct yazıp sorgulamaya çalışmıştım olmamıştı. Doğrusu buymuş demek. Çok teşekkürler.

  5. #5

  6. #6
    [small]balik tutma kismi[/small]
    Her hangi bir tabloda count(*) dedigin zaman geri donen satirlari sayiyor ya hani, eger group by'a herhangi bir kolonu koyarsan, oradaki degerlere gore gruplayip sayma islemini yapar. Yani
    select count(*) from [tablo]
    group by '1'
    dedigin zaman, '1'le gruplayip sana satir sayisini getirir. '1' senin yarattigin arbitrary bir deger oldugu icin herhangi bir sekilde sayma gruplarini bolmez. Buraya sen baska bir kolonu koyarsan, o kolondaki farkli deger sayisi kadar satir dondurur. Haliyle o gune ait kayitlari bulmus olursun.

    Ayni sekilde herhangi bir aggregate function'i bu yontemle kullanabilirsin (sum, avg, concat vb. gibi)

    Baska bir yone dogru gidecek olursak, diyelim ki gunluk degil de saatlik aggregated veri istiyorsun, o zaman date_format'a saat tanimini da koyman gerekir. Yalniz bu sana sadece var olan saatleri getirir.

    Soyle ki diyelim ki o tarih kolonunda 20090301'e ait herhangi bir kayit yok. O zaman sen mart ayinin verisini cektiginde 01'e ait herhangi bir satir goremezsin, cunku tarih kolonunda oyle bir kayit yok. Bu nedenle tarihsel sayi vs. bu gibi isler icin zaman boyutu yaratmak esastir. Daha cok veri ambari uygulamalarinda karsimiza ciksa da zaman boyutu (dimension) aslinda her asamada isimize yarar.
    Biraz daha aciklayacak olursak, zaman boyutu senin zamansal veri tuttugun detayda belli bir zaman araligi icin tum ihtimalleri icerir. Spesifik gunler ve ay bilgileri de mevcuttur. Boylece sen oradan [aggregate ederek] mart ayinda olabilecek butun gunleri alirsin; daha sonra left join'le yukarida soyledigin tabloyla birlestirirsin. Boylece her halukarda 31 tane satir gelir ve 20090301'e ait kaydin olmasa bile karsisinda 0 gorursun; daha duzgun analiz yapabilirsin.

  7. #7
    Vaktini ayırıp bu açıklamayı yazdığın için teşekkür ederim benim için oldukça verimli bir açıklama oldu JOIN komutlarını tam anlamadığım detaylı kullanamadım hiç, şuan da boş günleri göstermek gibi bir ihtiyacım yok ancak öğrenebilmek adına bana örnek LEFT JOIN'ide içeren SQL cümlesi oluşturabilmen mümküm müdür? Bende bir yandan konuyla ilgili bulabildiğim örnekleri inceleyeceğim. Teşekkürler.

  8. #8
    Kod:
       select zt.tarih
               , count(distinct it.kullanici_id)
         from zaman_tablosu zt 
    left join islem_tablosu it 
             on zt.tarih = date_format(kt.tarih_kolonu, '%Y-%m-%d')
    
    zt ve it tablolara verilmis rumuz olarak dusunebilirsin. Uzun tablo isimlerini kisaltmana yariyor. zt.tarih dedigimiz zaman, zaman_tablosu'nda bulunan tarih kolonunu kastetmis oluyoruz.
    Left Join bize zt.tarih'teki tum satirlari getiriyor; buna karsilik islem_tablosu'yla ON kosulunun oldugu gibi birlestirdigimiz icin, gerekli saymayi o gunler icin yapip cikan rakami donduruyor. Eger hicbir sey saymamissa, o zaman 0 geliyor haliyle.

    Yukaridaki ornekte gun kiriliminda kac tekil kullanici islem yapmis sorusunun yanitini aliyorum. Eger gun basina kac islem yapilmis denseydi bu sefer count(islem_id) derdim.

    Join'lerle ilgili daha ayrintili bilgiyi aratip zoque icinde rahatca bulabilecegine inaniyorum. Arastirip, spesifik bir sorun oldugunda yazarsan daha cok yardimci olabiliriz.

  9. #9
    Çok teşekkürler sevgili bgul fazlasıyla yardımcı oldunuz, ben ayrıca burada joinle ilgili kolay anlaşılır örnek ve açıklamar buldum. Benim gibi acemi kalanlara yalnızca 15dk'larını ayırıp incelemelerini öneririm.

+ Yanıtla

Bu konu başlığı için etiketler

Mesaj Seçenekleri

  • Yeni başlık açamazsınız
  • Cevap yazabilirsiniz
  • Dosya ekleyemezsiniz
  • Mesajlarınızı değiştiremezsiniz