Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

MySQL, Her zaman aralığı için max, min, first, last bulma


Öne çıkan mesajlar

Mesaj tarihi:
Şimdi tek bir tablo var, bu tabloda timestamp ve rate olmak üzere 2 değer var diyelim. Ben bu rate değerlerinin X ve Y tarihleri arasında her saat/dakika/gün vs. için maximum, minimum, ilk ve son değerlerini almak istiyorum. Mesela her saat için istiyorsam sonuç tablo şöyle olacak:

01.01.2012 00:00:00 - 01:00:00 aralığı için max: 1.3 min: 0.9 first: 1.2 last: 1.2
01.01.2012 01:00:00 - 02:00:00 aralığı için max: 1.7 min: 0.5 first: 1.2 last: 1.4 gibi

Sanırım MySQL de group by'ın bu işler için özel versiyonları varmış ama yetemedim ben.
Mesaj tarihi:
GROUP BY'la yapilir, tam dedigini anlamadim ama group by ile daha guzel yapilacak gibi duruyor.

ama olmazsa direk soyle yapabilirsin
WHERE ... ORDER BY date DESC LIMIT 1

dediginde max degerini alacan WHERE clause'da koydugun valuelara gore. aynen min icin de.
Mesaj tarihi:
tmstmp, rate

select date_format(tmstmp, '%Y%m%d%H')
, min(rate)
, max(rate)
, min(concat(tmstmp, rate)) first
, max(concat(tmstmp, rate)) last
from table1
group by date_format(tmstmp, '%Y%m%d%H')


deneme fırsatım olmadı tabii ki. concat doğrudan cast ediyor mu bilmiyorum. Yoksa tmstmp ve rate'i string yapıp öyle birleştirmek gerek.

Bu arada first ve last'ta, substring ile rate kısmını aldırtmak gerek.
Mesaj tarihi:
First ve lastı nası çekersin bilemedim ama min ve max nispeten kolay, istediğin her aralık tipi için ayrı query yazman lazım, misal;


select time as begin, date_add(time, INTERVAL t seconds) as end,
min(rate) as min_rate, max(rate) as max_rate
from tbl
group by round(unix_timestamp(time) DIV t)



t yerine istediğin aralığın saniye cinsinden uzunluğunu koy, dakikaysa 60 misal
Mesaj tarihi:
Concat çok mantıklıymış da replace edemeyebiliyo her zaman, bi tane delimiter koyup substringlemek daha iyi olabilir bi deniyim bakim

Edit: Dünyanın en çirkin querysi oldu ya sdfjhklalksd


select time as begin,
date_add(time, interval t second) as end,
min(rate) as min_rate,
max(rate) as max_rate,
substring(min(concat(time, 'ß', rate)), instr(min(concat(time, 'ß', rate)), 'ß') + 1) as first_rate,
substring(max(concat(time, 'ß', rate)), instr(max(concat(time, 'ß', rate)), 'ß') + 1) as last_rate
from tbl
group by round(unix_timestamp(time) div t)
Mesaj tarihi:
Ama tek query cok query'den daha iyi tabi.

MySQL'e socket acmak, haci ben geliyorum hazirla kendini demek cogu zaman cok daha fazla vakit aliyor query'nin calisma suresinden.

Haliyle tek query ile olmayacaksa bile stored procedure'a falan gomup halletmek baya avantajli.
Mesaj tarihi:
di said:

Ama tek query cok query'den daha iyi tabi.

MySQL'e socket acmak, haci ben geliyorum hazirla kendini demek cogu zaman cok daha fazla vakit aliyor query'nin calisma suresinden.

Haliyle tek query ile olmayacaksa bile stored procedure'a falan gomup halletmek baya avantajli.


aynen mysql'e connection acmak en kotusu. connection acilmadiginda sayfalarin acilma hizi bariz farkediyor.

ondan millet memcache redis diye cildiriyor :)

hatta hatta php'yi bitiren en onemli nedenlerden birisi bu. connection pooling yok. Amerika'da cogu startup ruby'yi tercih ediyor artik.
  • 3 hafta sonra ...
×
×
  • Yeni Oluştur...