Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to fetch the first and last record of a grouped record in a MySQL query with aggregate functions?

I am trying to fetch the first and the last record of a 'grouped' record.
More precisely, I am doing a query like this

SELECT MIN(low_price), MAX(high_price), open, close FROM symbols WHERE date BETWEEN(.. ..) GROUP BY YEARWEEK(date) 

but I'd like to get the first and the last record of the group. It could by done by doing tons of requests but I have a quite large table.

Is there a (low processing time if possible) way to do this with MySQL?

like image 771
Jimmy Avatar asked Sep 04 '09 14:09

Jimmy


People also ask

How do I get the first and last record of a table in SQL?

To get the first and last record, use UNION. LIMIT is also used to get the number of records you want.

How do I get last record by group by?

The group by will always return the first record in the group on the result set. SELECT id, category_id, post_title FROM posts WHERE id IN ( SELECT MAX(id) FROM posts GROUP BY category_id ); This will return the posts with the highest IDs in each group.

What is the query to fetch last record from the table?

To get the last record, the following is the query. mysql> select *from getLastRecord ORDER BY id DESC LIMIT 1; The following is the output.


2 Answers

You want to use GROUP_CONCAT and SUBSTRING_INDEX:

SUBSTRING_INDEX( GROUP_CONCAT(CAST(open AS CHAR) ORDER BY datetime), ',', 1 ) AS open SUBSTRING_INDEX( GROUP_CONCAT(CAST(close AS CHAR) ORDER BY datetime DESC), ',', 1 ) AS close  

This avoids expensive sub queries and I find it generally more efficient for this particular problem.

Check out the manual pages for both functions to understand their arguments, or visit this article which includes an example of how to do timeframe conversion in MySQL for more explanations.

like image 88
3 revs, 3 users 73% Avatar answered Sep 22 '22 08:09

3 revs, 3 users 73%


Try This to start with... :

Select YearWeek, Date, Min(Low_Price), Max(High_Price) From    (Select YEARWEEK(date) YearWeek, Date, LowPrice, High_Price     From Symbols S     Where Date BETWEEN(.. ..)     GROUP BY YEARWEEK(date)) Z Group By YearWeek, Date 
like image 45
Charles Bretana Avatar answered Sep 19 '22 08:09

Charles Bretana