This is my query in PostgreSQL:
SELECT
"axapta_calls".id,
"axapta_calls".call_time,
calls.calltime,
"calls"."id" as "call_id",
abs(extract(epoch from (axapta_calls.call_time::timestamp - calls.calltime::timestamp))) as ab
FROM
"axapta_calls"
inner join
"calls" (ON
axapta_calls.converted_outer_phone=calls.caller_phone
and abs(extract(epoch from (axapta_calls.call_time::timestamp - calls.calltime::timestamp)))<= 600 )
WHERE ("axapta_calls"."id" > 0)
GROUP BY "axapta_calls"."id", "calls"."id"
And result is:
How to get only one row with minimum "ab" value?
I change this query to:
SELECT
distinct on (axapta_calls.id)
"axapta_calls".id,
"axapta_calls".call_time,
calls.calltime,
"calls"."id" as "call_id",
abs(extract(epoch from (axapta_calls.call_time::timestamp - calls.calltime::timestamp))) as ab
FROM
"axapta_calls"
inner join
"calls" ON
axapta_calls.converted_outer_phone=calls.caller_phone
and abs(extract(epoch from (axapta_calls.call_time::timestamp - calls.calltime::timestamp)))<= 600
WHERE ("axapta_calls"."id" > 0)
GROUP BY "axapta_calls"."id", "calls"."id"
But get second row with ab = 347.783. What I am doing wrong?

DISTINCT ONhas to be Postgres...but maybe the OP wanted a solution for any database.