Существует как минимум два надежных подхода, в зависимости от того, насколько сложным вы хотите получить и насколько многочисленны и / или динамичны ключи.Первая очень проста:
select location_id
from report
where report_type = 'R'
group by location_id
having count(distinct data->'key1') > 1
or count(distinct data->'key2') > 1
or count(distinct data->'key3') > 1
Вторая конструкция более сложна, но имеет преимущество, заключающееся в предоставлении очень простого списка ключей:
--note that we also need distinct on location id to return one row per location
select distinct on(location_id) location_id
--jsonb_each returns the key, value pairs with value in type JSON (or JSONB) so the value field can handle integers, text, arrays, etc
from report, jsonb_each(data)
where report_type = 'R'
and key in('key1', 'key2', 'key3')
group by location_id, key
having count(distinct value) > 1
order by location_id