-2

请在下面查看我的查询:

select I.OID_CUSTOMER_DIM, I.segment  as PISTACHIO_SEGMENT,
   MAX(CASE WHEN S.SUBSCRIPTION_TYPE = '5' THEN 'Y' ELSE  'N' END ) PB_SUBS,
   max(case when S.SUBSCRIPTION_TYPE ='12' then 'Y' else 'N' end) DAILY_TASTE,
   MAX(CASE WHEN S.SUBSCRIPTION_TYPE ='8' THEN 'Y' ELSE 'N' END) COOKING_FOR_TWO
FROM WITH_MAIL_ID i   JOIN CUSTOMER_SUBSCRIPTION_FCT S
ON I.IDENTITY_ID = S.IDENTITY_ID 
WHERE S.SITE_CODE ='PB'and S.SUBSCRIPTION_END_DATE is  null
group by I.oid_customer_dim, I.segment

在这一行中,我得到了 654105 行,低于with_mail_id具有 706795 行的连接表之一。

现在,出于质量控制的目的,我的经理想知道为什么我的最终表格中没有所有行。我试图删除所有过滤器,但两个表中的结果仍然不同。我究竟做错了什么?

我的 SQL 还不是很好,这件事让我很困惑。

4

1 回答 1

2

您正在对两个表进行内部连接,因此只会返回 WITH_MAIL_ID 中可以连接 CUSTOMER_SUBSCRIPTION_FCT 的行。此外,您还有一个 group 子句。

首先是加入。如果您想返回所有行而不考虑连接条件,您可以使用左连接,但在这种情况下,所有 S. 列都将为 NULL,您必须处理它。

如果你运行它,你可能会看到计数是不同的:

select count(*) from WITH_MAIL_ID i
left join CUSTOMER_SUBSCRIPTION_FCT S 
    on I.IDENTITY_ID = S.IDENTITY_ID
where s.IDENTITY_ID is NULL

然而,最有可能的是它只是分组。如果您在两列上进行分组并根据该分组选择各种其他列的最大值,您会期望返回的行数少于原始表,否则为什么还要麻烦分组?

如果我有这样的数据:

groupkey1  value
1          2
1          10
2          1
2          1

然后我按 groupkey1 分组,然后选择 MAX(value) 我会得到 2 行[1,2], [2,1],而不是 4 行。

于 2012-04-13T21:14:45.120 回答