基于连接表的分区表

Posted

技术标签:

【中文标题】基于连接表的分区表【英文标题】:Partition table based on joined table 【发布时间】:2019-10-24 11:45:39 【问题描述】:

我们有 2 个表 Lead 和 Task。 一个潜在客户可以有多个任务。 我们想确定一个潜在客户是否有一个任务,其描述包含字符串'x'。

如果 Lead 有字符串,则它应该属于 group1,如果不属于 group2。

然后我们要计算每组和每周的潜在客户。 我们遇到的问题是,如果一个潜在客户有多个任务,其中一个任务的描述中有字符串“x”,而其他任务则没有,那么它会同时计入两组。

我们需要一些类似于休息的东西;子查询的 IFF 子句中的语句,因此如果满足第一个条件 = 包含字符串 x,则不再计算其他任务。 我们将如何实现这一目标?

到目前为止,我们有以下声明: --SQL:

SELECT LeadDate, GROUP, COUNT(LEAD_ID_T1)
FROM LEAD Lead INNER JOIN
     (SELECT DISTINCT LEAD.ID AS LEAD_ID_T1,
                      IFF(CONTAINS(Task.DESCRIPTION,
                                   'x'),
                          'GROUP1',
                          'GROUP2') AS GROUP
               FROM TASK Task
                        RIGHT JOIN LEAD ON TASK.WHO_ID = LEAD.ID
               ) T1 ON T1.LEAD_ID_T1 = LEAD.ID
GROUP BY LeadDate,GROUP;

代码中断,因为它无法聚合度量。

非常感谢您的任何意见。这几天一直困扰着我。

【问题讨论】:

【参考方案1】:

我在想 EXISTSCASE 表达式:

select l.*,
       (case when exists (select 1
                          from task t
                          where t.who_id = l.id and
                                t.description like '%x%'
                         )
             then 'GROUP1' else 'GROUP2'
        end) as the_group
from lead l;

【讨论】:

【参考方案2】:

您也可以尝试这样的操作,CASE 使用 1 和 0,然后使用 SUM

SELECT LeadDate, 
sum(CASE When  t.description like '%x%'then 1 else 0 end) as Group1,
sum(CASE When  t.description like '%x%'then 0 else 1 end) as Group2
FROM TASK t
RIGHT JOIN LEAD l ON t.WHO_ID = l.ID
GROUP BY LeadDate;

【讨论】:

以上是关于基于连接表的分区表的主要内容,如果未能解决你的问题,请参考以下文章

HIVE:在分区表中映射联接

Bigquery 整数范围分区

IMPALA:基于未分区表创建新的分区表

我可以将数据从一个配置单元分区移动到同一张表的另一个分区吗

sql server 分区

sql server 分区(上)