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


SpiderS_DangeR

Öne çıkan mesajlar

Ş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.
Link to comment
Sosyal ağlarda paylaş

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.
Link to comment
Sosyal ağlarda paylaş

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
Link to comment
Sosyal ağlarda paylaş

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)
Link to comment
Sosyal ağlarda paylaş

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.
Link to comment
Sosyal ağlarda paylaş

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.
Link to comment
Sosyal ağlarda paylaş

  • 3 hafta sonra ...
×
×
  • Yeni Oluştur...