I have a table called mov_entrys and they have multiple historic records, in other words, duplicated records this is my main SQL statement
SELECT me.mov_entry_id, me.mov_entry_ean13, me.plate, mv.name vehiclename, ma.name areaname, ml.name locationame, me.value, mov_pay.name paytype ,me.validated, me_usu.name operatorName, to_char(me.created_at, 'DD/MM/YYYY HH24:MI:SS') created_at, to_char(me.updated_at, 'DD/MM/YYYY HH24:MI:SS') updated_at FROM mov_entrys me LEFT OUTER JOIN mov_payment_type mov_pay on mov_pay.mov_payment_type_id = me.mov_payment_type_id JOIN mov_vehicles mv ON me.mov_vehicle_id = mv.mov_vehicle_id JOIN mov_areas ma ON me.mov_area_id = ma.mov_area_id JOIN mov_locations ml ON ma.mov_location_id = ml.mov_location_id JOIN mov_users me_usu ON me.mov_user_id = me_usu.mov_user_id WHERE me.value > 0 AND me.validated <> 'O' AND me.validated <> 'V' AND me.validated <> 'I' AND me.created_at >= date_trunc('month', NOW()) - '1 month'::interval order by mov_entry_id desc
But the records are like this example:
id ean13 value validated created_at updated_at 1 7800003378198 0 N 2019-10-04 09:00:31 2019-10-04 09:00:31 2 7800003378198 8 S 2019-10-04 13:01:11 2019-10-04 13:01:11 3 7800003378198 10.5 AD 2019-10-04 13:02:13 2019-10-04 13:02:13 3 7800003378198 10.5 I 2019-10-04 13:05:13 2019-10-04 13:05:13
In Laravel when a data is created the created_at and updated_at is the same data, but I want the start date and last date from this record that has the same ean13 data 7800003378198
The main query returns the record that I want but with the same data and I want the real created data and last data
if you think the record in the top, I want the return like this, if I use group I cant have like this
id ean13 value validated created_at updated_at 2 7800003378198 8 S 2019-10-04 09:00:31 2019-10-04 13:05:13 3 7800003378198 10.5 AD 2019-10-04 09:00:31 2019-10-04 13:05:13
I try to make a subquery but I don’t know why always make an INFINITE load to return a data I think I’m doing something wrong, this is my query with subquery
SELECT me.mov_entry_id, me.mov_entry_ean13, me.plate, mv.name vehiclename, ma.name areaname, ml.name locationame, me.value, mov_pay.name paytype ,me.validated, me_usu.name operatorName, to_char(me.created_at, 'DD/MM/YYYY HH24:MI:SS') created_at, to_char(me.updated_at, 'DD/MM/YYYY HH24:MI:SS') updated_at, ( SELECT me_v2.created_at FROM mov_entrys me_v2 WHERE me.mov_entry_ean13 = me_v2.mov_entry_ean13 ORDER BY me_v2.created_at DESC LIMIT 1 ) date_test FROM mov_entrys me LEFT OUTER JOIN mov_payment_type mov_pay on mov_pay.mov_payment_type_id = me.mov_payment_type_id JOIN mov_vehicles mv ON me.mov_vehicle_id = mv.mov_vehicle_id JOIN mov_areas ma ON me.mov_area_id = ma.mov_area_id JOIN mov_locations ml ON ma.mov_location_id = ml.mov_location_id JOIN mov_users me_usu ON me.mov_user_id = me_usu.mov_user_id WHERE me.value > 0 AND me.validated <> 'O' AND me.validated <> 'V' AND me.validated <> 'I' AND me.created_at >= date_trunc('month', NOW()) - '1 month'::interval order by mov_entry_id desc
When I execute this query alone it is working fine giving me the last record, what I’m doing wrong? This is my test query :
SELECT me.created_at FROM mov_entrys me WHERE me.mov_entry_ean13 = '7800003378198' ORDER BY me.created_at DESC LIMIT 1
I mana
Advertisement
Answer
Consider aggregating on dates with MIN
and MAX
, grouping by all other SELECT
columns. Below uses shorter aliases for readability:
SELECT e.mov_entry_id, e.mov_entry_ean13, e.plate, v.name AS vehiclename, a.name AS areaname, l.name AS locationame, e.value, p.name AS paytype, e.validated, u.name AS operatorName, to_char(MIN(e.created_at), 'DD/MM/YYYY HH24:MI:SS') AS created_at, to_char(MAX(e.updated_at), 'DD/MM/YYYY HH24:MI:SS') AS updated_at FROM mov_entrys e LEFT OUTER JOIN mov_payment_type p ON p.mov_payment_type_id = e.mov_payment_type_id INNER JOIN mov_vehicles v ON e.mov_vehicle_id = v.mov_vehicle_id INNER JOIN mov_areas a ON e.mov_area_id = a.mov_area_id INNER JOIN mov_locations l ON a.mov_location_id = l.mov_location_id INNER JOIN mov_users u ON e.mov_user_id = u.mov_user_id WHERE e.value > 0 AND e.validated <> 'O' AND e.validated <> 'V' AND e.validated <> 'I' AND e.created_at >= date_trunc('month', NOW()) - '1 month'::interval GROUP BY e.mov_entry_id, e.mov_entry_ean13, e.plate, v.name, a.name,l.name, e.value, p.name, e.validated, u.name ORDER BY e.mov_entry_id desc