I have a table with id, city_id, and stock which looks like this.
id | city_id | stock |
---|---|---|
1 | 1 | 1000 |
2 | 2 | 500 |
3 | 3 | 11000 |
4 | 2 | 600 |
5 | 3 | 12000 |
6 | 1 | 2000 |
9 | 3 | 13000 |
10 | 1 | 3000 |
11 | 1 | 4000 |
12 | 2 | 700 |
To select the latest stock values for each city_id I used the following query, which works fine.
SELECT `stock` FROM `stock_table` WHERE id in ( SELECT MAX(id) FROM `stock_table` GROUP BY city_id );
It returns
stock |
---|
13000 |
4000 |
700 |
Now I want to select 2nd latest stock entry for each city_id. So the output should be like the following table.
stock |
---|
12000 |
3000 |
600 |
Any help is greatly appreciated. Thanks!
Advertisement
Answer
In MySQL 8 you can use the row_number()
window function to assign a number to each row ordered by the id
per partition of city_id
. Then just filter on that being 2
(in your example; you can use any number).
SELECT x.stock FROM (SELECT s.stock, row_number() OVER (PARTITION BY s.city_id ORDER BY s.id DESC) rn FROM stock_table s) x WHERE x.rn = 2;