首页 > 解决方案 > 是否可以将外部数据处理为某种虚拟表?

问题描述

我有以下问题,我需要制作一个漏斗,我需要在其中显示我拥有的数据与数据库中的数据之间的相关性。我有以下类型的查询:

select name, count(distinct email) from some_table
   where name = 'name_1' and email in ('email 1', 'email 2', 'email 3') or 
         name = 'name_2' and email in ('email 2', 'email 4', 'email 5')
group by 1

是否有可能以这样的方式处理 where 语句中的数据,以便我可以将其作为一个表格来处理,我的意思是如果有可能在 where 语句中按名称计算电子邮件到类似这样的东西?

select name, count(emails in the list), count(distinct email)

得到这样的结果

name_1 3 2
name_2 3 1
...  

列出的电子邮件可能不在 some_table 中,如果我要加入表,我将为每个不直接相关的数据块加入 3 个不同的表。我拥有的数据是手动处理的,不会添加到数据库中。

标签: sqlpostgresql

解决方案


您可以使用 VALUES 列表来构建您的虚拟表,并将其连接到您的真实表。

select f.name, count(distinct email) from some_table join 
   (VALUES ('name_1', '{email 1,email 2,email 3}'::text[]), 
           ('name_2', '{email 2,email 4,email 5}')) f(name,emails)
   on some_table.name=f.name and ARRAY[email] && emails
group by 1

我不得不从 IN 列表切换到等效的数组操作,因为表可以有数组但不能有列表。

计数(列表中的电子邮件)

我不确定这意味着什么。也许这是:?

select f.name, cardinality(emails), count(distinct email) from some_table join 
       (VALUES ('name_1', '{email 1,email 2,email 3}'::text[]), 
               ('name_2', '{email 2,email 4,email 5}')) f(name,emails)
       on some_table.name=f.name and ARRAY[email] && emails
    group by 1,2

推荐阅读