Currently, I have a table as below and I wanted to pull the records with id having the estimated_date which are assigned to least value of update_index value and if the value is null I want to go the value assigned to next update_index,
For example, for record with
Input Table
+----+--------------+---------------------+
| id | update_index | estimated_date |
+----+--------------+---------------------+
| 73 | 1 | 2017-06-13 00:00:00 |
+----+--------------+---------------------+
| 73 | 2 | 2017-01-13 00:00:00 |
+----+--------------+---------------------+
| 73 | 3 | 2017-05-13 00:00:00 |
+----+--------------+---------------------+
| 73 | 4 | NULL |
+----+--------------+---------------------+
| 75 | 1 | 2017-01-01 00:00:00 |
+----+--------------+---------------------+
| 75 | 2 | NULL |
+----+--------------+---------------------+
| 75 | 3 | 2019-01-01 00:00:00 |
+----+--------------+---------------------+
| 76 | 1 | NULL |
+----+--------------+---------------------+
| 76 | 2 | 2018-06-01 00:00:00 |
+----+--------------+---------------------+
Output Table
+----+--------------+---------------------+
| id | update_index | estimated_date |
+----+--------------+---------------------+
| 73 | 1 | 2017-06-13 00:00:00 |
+----+--------------+---------------------+
| 75 | 1 | 2017-01-01 00:00:00 |
+----+--------------+---------------------+
| 76 | 2 | 2018-06-01 00:00:00 |
+----+--------------+---------------------+
I have tried the below values but I get only one record always, can you please help me with this?
SELECT id,update_index,estimated_date
FROM tablename where estimated_date = (
SELECT DISTINCT estimated_date
FROM tablename
where estimated_date is not null
ORDER BY id, udpate_index ASC
LIMIT 1);
`
I would use a correlated subquery:
select t.*
from tablename t
where t.update_index = (select t2.update_index
from tablename t2
where t2.id = t.id and t2.estimated_date is not null
order by t2.update_index asc
limit 1
);
Please try this.
select t2.*
from
(select id, min(update_index) updated_index
from input_table
where estimated_date is not null
group by 1 )t1
left join input_table t2
on t1.id = t2.id
and t1.update_index = t2.update_index
You cant try this:
select t.id, t.update_index, t.estimated_date from tablename t where t.update_index=(select MIN(update_index) from tablename t1 where t1.id=t.id and t1.estimated_date is not null) group by t.id
Use subquery with LIMIT
clause :
select t.*
from table t
where t.update_index = (select t2.update_index
from table t2
where t2.id = t.id and t2.estimated_date is not null
order by t2.estimated_date desc
limit 1
);
However, your sample data more suggest me :
select t.*
from table t
where t.estimated_date = (select max(t2.estimated_date)
from table t2
where t2.id = t.id and t2.estimated_date is not null
);
If you have a ties with estimated_date
then first approach would work instead.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.