SQL cannot add columns to query
-
16-02-2021 - |
Question
I have the following query (PostgreSQL 9.5.19):
with userlist as (
select a.ips,
array_agg(t.super_user_id) as super_users
from tmp_table_1 t
left join unnest(t.ips) as a(ips) on true
group by a.ips
), shared_users as (
select u.ips,
array(select distinct ul.uid
from userlist u2, unnest(u2.super_users) as ul(uid)
where u.super_users && u2.super_users
order by ul.uid) as super_users
from userlist u
)
select s.super_users, array_agg(distinct s.ips) as ips,
(select sum(msg_count) from tmp_table_1 where super_user_id in s.super_users) as sum_msg_count
from shared_users s
group by s.super_users;
I get the following error:
ERROR: syntax error at or near "s" LINE 38: ...sg_count) from tmp_table_1 where super_user_id in s.super_us... ^
It seems like I cannot access s.super_users
from within the subquery.
Anyone know how I can do this?
Here is a full example: https://www.db-fiddle.com/f/geB9V6TdHEkF2mSqpd2b4g/1
Maybe I am not approaching this correctly?
Question
How can I add the additional columns (sum_msg_count
, sum_user_count
, max_last_date
and pubs
) to the result set?
Desired result
|super_users | ips |sum_msg_count| sum_user_count | max_last_date | pubs |
|---------------------------------|-------------------------------------------------------------|-------------|-----------------|--------------------------------|-----------------------------|
|{522460771,522460772,522460773} | {94.134.88.115,94.134.88.124,94.134.88.125,94.134.88.136} | 30 | 9 | "2018-06-30 21:29:48.664000" | {ad2,googlecooler,ads,ad1} |
|{522460774,522460775} | {127.0.0.1,5.5.5.5} | 20 | 6 | "2018-06-30 21:29:48.664000" | {googlecooler,ad3,ad1} |
|{522460776} | {8.8.8.8} | 10 | 3 | "2018-06-30 21:29:48.664000" | {googlecooler,ads} |
Solution
You should use ANY
, not IN
to search in an array
...where super_user_id = ANY (s.super_users)
OTHER TIPS
with userlist as (
select a.ips, array_agg(t.super_user_id) as super_users
from tmp_table_1 t
left join unnest(t.ips) as a(ips) on true
group by a.ips
),
shared_users as (
select u.ips,
array(select distinct ul.uid
from userlist u2, unnest(u2.super_users) as ul(uid)
where u.super_users && u2.super_users
order by ul.uid) as super_users
from userlist u
) --select * from shared_users
select s.super_users, array_agg(distinct s.ips) as ips,
(select sum(msg_count) from tmp_table_1 where super_user_id = any(s.super_users)) as sum_msg_count,
(select sum(user_count) from tmp_table_1 where super_user_id = any(s.super_users)) as sum_user_count,
(select max(last_date) from tmp_table_1 where super_user_id = any(s.super_users)) as max_last_date,
(select array_agg(pubs) from (select a.pubs, array_agg(t.super_user_id) as super_users
from tmp_table_1 t
left join unnest(t.pubs) as a(pubs) on true
and t.super_user_id = any(s.super_users)
where a.pubs is not null
group by a.pubs) as pubsAlias) as pubs
from shared_users s
group by s.super_users;
Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange