Re: Constructing query to display item count based on increments of time

2010-10-07 Thread Johan De Meersman
On Wed, Oct 6, 2010 at 11:15 PM, Hank hes...@gmail.com wrote:

 Ok, I can see that.


Oh, I wasn't implying that mine was necessarily better - I didn't even think
of doing it that way. I suggested a benchmark because different fuctions
might have different execution speeds. Now actually thinking about this,
I've come up with three different formulations of mine, even :-)

Given that I'm curious about this, I've bothered to do the benchmarks myself
:-) All running on the same virtual machine, a VirtualBox on my laptop,
which has 1 cpu and 384 megs of memory, running Debian 5.0.5 and MySQL
5.1.47 and using mysqlslap to perform 200.000 calls in the same thread,
iterated five times. My chosen datestamp is '2010-10-07 08:38:07'.



   - select sql_no_cache unix_timestamp('2010-10-07 08:38:07') -
   (unix_timestamp('2010-10-07 08:38:07') % 600);
  - Average number of seconds to run all queries: 30.592 seconds
  Minimum number of seconds to run all queries: 30.084 seconds
  Maximum number of seconds to run all queries: 31.374 seconds


   - select sql_no_cache (unix_timestamp('2010-10-07 08:38:07') div 600) *
   600;
  - Average number of seconds to run all queries: 29.606 seconds
  Minimum number of seconds to run all queries: 29.454 seconds
  Maximum number of seconds to run all queries: 29.813 seconds


   - select sql_no_cache floor(unix_timestamp('2010-10-07 08:38:07') / 600)
   * 600;
  - Average number of seconds to run all queries: 30.857 seconds
  Minimum number of seconds to run all queries: 30.274 seconds
  Maximum number of seconds to run all queries: 31.378 seconds


   - select sql_no_cache concat(date_format('2010-10-07 08:38:07', '%Y-%m-%d
   %H:'), truncate(minute('2010-10-07 08:38:07') / 10, 0), '0');
  - Average number of seconds to run all queries: 32.905 seconds
  Minimum number of seconds to run all queries: 32.099 seconds
  Maximum number of seconds to run all queries: 33.429 seconds


   - select sql_no_cache concat(left(DATE_FORMAT('2010-10-07 08:38:07',
   '%Y-%m-%d %h:%i'),15),'0');
   - Average number of seconds to run all queries: 31.042 seconds
  Minimum number of seconds to run all queries: 30.369 seconds
  Maximum number of seconds to run all queries: 31.727 seconds


   - select sql_no_cache DATE_FORMAT('2010-10-07 08:38:07', '%Y-%m-%d %h:'
   ), 10*(minute('2010-10-07 08:38:07')%6);
   - Average number of seconds to run all queries: 32.012 seconds
  Minimum number of seconds to run all queries: 31.335 seconds
  Maximum number of seconds to run all queries: 32.894 seconds


So, it turns out that the method used doesn't make a major difference.

My guess would be that function execution and arithmetic is actually pretty
much instant, and that the major cost here was simply initializing the
parser and other structures. There is in any case no obvious relation
between number of function calls and execution time here.




 Here's a different approach that gets it down to
 two function calls and some math.. and the DATE_FORMAT call might not
 even be needed depending on the actual application.

 select
   DATE_FORMAT(start_time, %Y-%m-%d %h: ) as dhour,
  10*(minute(start_time)%6) as dtime ,count(*)
 from table
 group by dhour,dtime;

 -Hank



 On Wed, Oct 6, 2010 at 4:22 PM, Johan De Meersman vegiv...@tuxera.be
 wrote:
  Two people already who suggested a text-based approach vs. my numeric
  approach.
 
  Analysing, my method takes a single function call per record
 (to_unixtime);
  Travis' takes 4 (concat, date_format, truncate, minute) and Hank's 3
  (concate, left, date_format).
 
  Someone feel like benchmarking ? :-D
 
 
 
  On Wed, Oct 6, 2010 at 5:44 PM, Hank hes...@gmail.com wrote:
 
  Here's what I came up with:
 
   select concat(left(DATE_FORMAT(start_time, %Y-%m-%d %h:%i
  ),15),0) as time, count(*)  from table group by time
 
  -Hank
 
  
   How would one go about to construct a query that counts items within
 an
   increment or span of time, let's say increments of 10 minutes?
   Imagine a simple table where each row has a timestamp, and the query
   should return the count of items occurring within the timespan of a
   defined
   period.
  
   Say,
  
   09:00: 14
   09:10: 31
   09:20: 25
   09:30:  0
   09:40: 12
  
   etc.
  
   I have been able to get collections of item occurrence based on month
   and
   day by using GROUP BY together with a DATE_FORMAT( start_time, %d %m
   %Y )
   eg.
   I can however not seem to be able to find the solution to grouping
   based
   on the minute increments in my example above.
  
   Any suggestions?
  
   --
   Kind regards
  
  
   Pascual Strømsnæs
  
   --
   MySQL General Mailing List
   For list archives: http://lists.mysql.com/mysql
   To unsubscribe:
   http://lists.mysql.com/mysql?unsub=travis_...@hotmail.com
  
  
  
   --
   MySQL General Mailing List
   For list archives: 

Constructing query to display item count based on increments of time

2010-10-06 Thread Pascual Strømsnæs

Hi!

How would one go about to construct a query that counts items within an 
increment or span of time, let's say increments of 10 minutes?
Imagine a simple table where each row has a timestamp, and the query 
should return the count of items occurring within the timespan of a 
defined period.


Say,

09:00: 14
09:10: 31
09:20: 25
09:30:  0
09:40: 12

etc.

I have been able to get collections of item occurrence based on month 
and day by using GROUP BY together with a DATE_FORMAT( start_time, %d 
%m %Y ) eg.
I can however not seem to be able to find the solution to grouping based 
on the minute increments in my example above.


Any suggestions?

--
Kind regards


Pascual Strømsnæs

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/mysql?unsub=arch...@jab.org



Re: Constructing query to display item count based on increments of time

2010-10-06 Thread Johan De Meersman
convert to unixtime, convert your interval to unixtime, creatively combine
with integer division to get a base number for each period, group by that
and count().

2010/10/6 Pascual Strømsnæs pasc...@egoria.no

 Hi!

 How would one go about to construct a query that counts items within an
 increment or span of time, let's say increments of 10 minutes?
 Imagine a simple table where each row has a timestamp, and the query should
 return the count of items occurring within the timespan of a defined period.

 Say,

 09:00: 14
 09:10: 31
 09:20: 25
 09:30:  0
 09:40: 12

 etc.

 I have been able to get collections of item occurrence based on month and
 day by using GROUP BY together with a DATE_FORMAT( start_time, %d %m %Y )
 eg.
 I can however not seem to be able to find the solution to grouping based on
 the minute increments in my example above.

 Any suggestions?

 --
 Kind regards


 Pascual Strømsnæs

 --
 MySQL General Mailing List
 For list archives: http://lists.mysql.com/mysql
 To unsubscribe:http://lists.mysql.com/mysql?unsub=vegiv...@tuxera.be




-- 
Bier met grenadyn
Is als mosterd by den wyn
Sy die't drinkt, is eene kwezel
Hy die't drinkt, is ras een ezel


Re: Constructing query to display item count based on increments of time

2010-10-06 Thread Travis Ard
Maybe you could use something like the following to truncate your times to 
10 minute increments before doing your GROUP BY and COUNT():


select concat(date_format(timestamp_col, '%Y-%m-%d %H:'), 
truncate(minute(timestamp_col) / 10, 0), '0') from your_table;


-Travis

--
From: Pascual Strømsnæs pasc...@egoria.no
Sent: Wednesday, October 06, 2010 4:20 AM
To: [MySQL] mysql@lists.mysql.com
Subject: Constructing query to display item count based on increments of 
time



Hi!

How would one go about to construct a query that counts items within an 
increment or span of time, let's say increments of 10 minutes?
Imagine a simple table where each row has a timestamp, and the query 
should return the count of items occurring within the timespan of a 
defined period.


Say,

09:00: 14
09:10: 31
09:20: 25
09:30:  0
09:40: 12

etc.

I have been able to get collections of item occurrence based on month and 
day by using GROUP BY together with a DATE_FORMAT( start_time, %d %m 
%Y ) eg.
I can however not seem to be able to find the solution to grouping based 
on the minute increments in my example above.


Any suggestions?

--
Kind regards


Pascual Strømsnæs

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: 
http://lists.mysql.com/mysql?unsub=travis_...@hotmail.com





--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/mysql?unsub=arch...@jab.org



Re: Constructing query to display item count based on increments of time

2010-10-06 Thread Hank
Here's what I came up with:

 select concat(left(DATE_FORMAT(start_time, %Y-%m-%d %h:%i
),15),0) as time, count(*)  from table group by time

-Hank


 How would one go about to construct a query that counts items within an
 increment or span of time, let's say increments of 10 minutes?
 Imagine a simple table where each row has a timestamp, and the query
 should return the count of items occurring within the timespan of a defined
 period.

 Say,

 09:00: 14
 09:10: 31
 09:20: 25
 09:30:  0
 09:40: 12

 etc.

 I have been able to get collections of item occurrence based on month and
 day by using GROUP BY together with a DATE_FORMAT( start_time, %d %m %Y )
 eg.
 I can however not seem to be able to find the solution to grouping based
 on the minute increments in my example above.

 Any suggestions?

 --
 Kind regards


 Pascual Strømsnæs

 --
 MySQL General Mailing List
 For list archives: http://lists.mysql.com/mysql
 To unsubscribe: http://lists.mysql.com/mysql?unsub=travis_...@hotmail.com



 --
 MySQL General Mailing List
 For list archives: http://lists.mysql.com/mysql
 To unsubscribe:    http://lists.mysql.com/mysql?unsub=hes...@gmail.com



--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/mysql?unsub=arch...@jab.org



Re: Constructing query to display item count based on increments of time

2010-10-06 Thread Johan De Meersman
Two people already who suggested a text-based approach vs. my numeric
approach.

Analysing, my method takes a single function call per record (to_unixtime);
Travis' takes 4 (concat, date_format, truncate, minute) and Hank's 3
(concate, left, date_format).

Someone feel like benchmarking ? :-D



On Wed, Oct 6, 2010 at 5:44 PM, Hank hes...@gmail.com wrote:

 Here's what I came up with:

  select concat(left(DATE_FORMAT(start_time, %Y-%m-%d %h:%i
 ),15),0) as time, count(*)  from table group by time

 -Hank

 
  How would one go about to construct a query that counts items within an
  increment or span of time, let's say increments of 10 minutes?
  Imagine a simple table where each row has a timestamp, and the query
  should return the count of items occurring within the timespan of a
 defined
  period.
 
  Say,
 
  09:00: 14
  09:10: 31
  09:20: 25
  09:30:  0
  09:40: 12
 
  etc.
 
  I have been able to get collections of item occurrence based on month
 and
  day by using GROUP BY together with a DATE_FORMAT( start_time, %d %m
 %Y )
  eg.
  I can however not seem to be able to find the solution to grouping based
  on the minute increments in my example above.
 
  Any suggestions?
 
  --
  Kind regards
 
 
  Pascual Strømsnæs
 
  --
  MySQL General Mailing List
  For list archives: http://lists.mysql.com/mysql
  To unsubscribe:
 http://lists.mysql.com/mysql?unsub=travis_...@hotmail.com
 
 
 
  --
  MySQL General Mailing List
  For list archives: http://lists.mysql.com/mysql
  To unsubscribe:http://lists.mysql.com/mysql?unsub=hes...@gmail.com
 
 

 --
 MySQL General Mailing List
 For list archives: http://lists.mysql.com/mysql
 To unsubscribe:http://lists.mysql.com/mysql?unsub=vegiv...@tuxera.be




-- 
Bier met grenadyn
Is als mosterd by den wyn
Sy die't drinkt, is eene kwezel
Hy die't drinkt, is ras een ezel


Re: Constructing query to display item count based on increments of time

2010-10-06 Thread Hank
Ok, I can see that.  Here's a different approach that gets it down to
two function calls and some math.. and the DATE_FORMAT call might not
even be needed depending on the actual application.

select
   DATE_FORMAT(start_time, %Y-%m-%d %h: ) as dhour,
  10*(minute(start_time)%6) as dtime ,count(*)
from table
group by dhour,dtime;

-Hank



On Wed, Oct 6, 2010 at 4:22 PM, Johan De Meersman vegiv...@tuxera.be wrote:
 Two people already who suggested a text-based approach vs. my numeric
 approach.

 Analysing, my method takes a single function call per record (to_unixtime);
 Travis' takes 4 (concat, date_format, truncate, minute) and Hank's 3
 (concate, left, date_format).

 Someone feel like benchmarking ? :-D



 On Wed, Oct 6, 2010 at 5:44 PM, Hank hes...@gmail.com wrote:

 Here's what I came up with:

  select concat(left(DATE_FORMAT(start_time, %Y-%m-%d %h:%i
 ),15),0) as time, count(*)  from table group by time

 -Hank

 
  How would one go about to construct a query that counts items within an
  increment or span of time, let's say increments of 10 minutes?
  Imagine a simple table where each row has a timestamp, and the query
  should return the count of items occurring within the timespan of a
  defined
  period.
 
  Say,
 
  09:00: 14
  09:10: 31
  09:20: 25
  09:30:  0
  09:40: 12
 
  etc.
 
  I have been able to get collections of item occurrence based on month
  and
  day by using GROUP BY together with a DATE_FORMAT( start_time, %d %m
  %Y )
  eg.
  I can however not seem to be able to find the solution to grouping
  based
  on the minute increments in my example above.
 
  Any suggestions?
 
  --
  Kind regards
 
 
  Pascual Strømsnæs
 
  --
  MySQL General Mailing List
  For list archives: http://lists.mysql.com/mysql
  To unsubscribe:
  http://lists.mysql.com/mysql?unsub=travis_...@hotmail.com
 
 
 
  --
  MySQL General Mailing List
  For list archives: http://lists.mysql.com/mysql
  To unsubscribe:    http://lists.mysql.com/mysql?unsub=hes...@gmail.com
 
 

 --
 MySQL General Mailing List
 For list archives: http://lists.mysql.com/mysql
 To unsubscribe:    http://lists.mysql.com/mysql?unsub=vegiv...@tuxera.be




 --
 Bier met grenadyn
 Is als mosterd by den wyn
 Sy die't drinkt, is eene kwezel
 Hy die't drinkt, is ras een ezel


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/mysql?unsub=arch...@jab.org