I have below query to pivot, how to get status
value filtered on latest updated_on
row for each obj_key
x
select obj_key, max(updated_on) as updated_on, max(att.status) as status,
COALESCE(max(array_to_string(v_date,'||'::text)) filter (where att.type_key=1),(select default_value from types where type_key=1)) as "DOB",
COALESCE(max(array_to_string(v_text,'||'::text)) filter (where att.type_key=2),(select default_value from types where type_key=2)) as "First Name",
COALESCE(max(array_to_string(v_text,'||'::text)) filter (where att.type_key=3),(select default_value from types where type_key=3))as "Last Name",
COALESCE(max(array_to_string(v_number,'||'::text)) filter (where att.type_key=4),(select default_value from types where type_key=4)) as "Contact"
from attributes att right join types ty on att.type_key=ty.type_key
group by obj_key
Table/data is here dbfiddle
i was trying by first_value(status) OVER( ORDER BY updated_on) AS status
but no luck
Can we get status as per max(updated_on) for each obj_key ?
Advertisement
Answer
Try this version, the first_value(status) is changed to last_value(status) and the OVER W has been moved to the aggregate, so inside of the COALESCE statements.
select DISTINCT ON (obj_key)
obj_key, updated_on,
last_value(status) OVER w AS created_by,
COALESCE(max(array_to_string(v_date,'||'::text)) filter (where
att.type_key=1) OVER w ,(select default_value from types where
type_key=1)) as "DOB",
COALESCE(max(array_to_string(v_text,'||'::text)) filter (where
att.type_key=2) OVER w ,(select default_value from types where
type_key=2)) as "First Name",
COALESCE(max(array_to_string(v_text,'||'::text)) filter (where
att.type_key=3) OVER w ,(select default_value from types where
type_key=3)) as "Last Name",
COALESCE(max(array_to_string(v_number,'||'::text)) filter (where
att.type_key=4) OVER w ,(select default_value from types where
type_key=4)) as "Contact"
from attributes att right join types ty on att.type_key=ty.type_key
WINDOW w AS (PARTITION BY obj_key ORDER BY updated_on)
ORDER BY obj_key, updated_on DESC NULLS LAST;