Kod:...where year(2009) and month(06) and dayofmonth(02)
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:...where year(2009) and month(06) and dayofmonth(02)
Ben herhalde konuyu yanlış anladım.
[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.
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.
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.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')
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.