2014-07-16 18 views
1

如果我有一个表“表1”,列有:选择在当在另一场对应一个字段的最大的东西

EMAIL | USER_ID | START_DATE | CANCEL_DATE 

如果一个人的迹象,进了我们的数据库,他们出现一次。如果他们取消他们的账户,他们将再次出现,并且CANCEL_DATE被填充 - 这样两次。如果他们重新订阅,他们会出现3次,新记录会有新的START_DATE。

所以表格是在订阅而不是帐户级别。

如果我想拉已经取消,因为重新订阅不是我需要(用简单的英语)的电子邮件地址和人的用户ID的列表,以这样的:

  1. 选择所有记录(电子邮件和ID)在CANCEL_DATE至少有1个值(如果他们从未取消它是NULL)
  2. 然后,这些记录中只包括那些在查看START_DATE的MAX时CANCEL_DATE不为NULL的记录。

我该怎么做?

如果是excel,我会查看取消日期列的最大开始日期。

希望我有道理?

  • 稍后添加。我还需要补充的条件,最后的结果应该只包括其中CANCEL_DATE < CURRENT_DATE

我想我使用子查询了它的记录。这是一种更清洁的方式吗?

SELECT EMAIL, USER_ID FROM (
    SELECT EMAIL, GUID, CANCEL_DATE 
    FROM table1 
    GROUP BY EMAIL, USER_ID, CANCEL_DATE 
    HAVING MAX(CONTRACT_EFFECTIVE_DATE) < MAX(SUBSCRIPTION_END_DATE) 
) base1 
WHERE SUBSCRIPTION_END_DATE < CURRENT_DATE 

回答

2

START_DATE和CANCLE_DATE是互斥的,只有一个填充,另一个NULL?

select email, user_id 
from table1 
group by email, user_id 
having max(START_DATE) > max(CANCEL_DATE) 

这只返回活动的订阅者,他们被取消,然后再次订阅。

编辑:

你似乎要你只需要改变的情况正好相反:

select email, user_id 
from table1 
group by email, user_id 
having max(START_DATE) < max(CANCEL_DATE) 

这将返回所有当前取消订阅。

+0

感谢@dnoeth查询运行,这比我以前更进一步。但是结果集比我知道的要小。这是什么信号?我期待〜50k的记录,但相反得到1.5k。我知道这些信息并不多,但不知道它是否意味着什么? –

+0

这是重新订阅的用户。我认为OP希望“目前全部取消”用户。我想只是将比较反转为max(CANCEL_DATE)> max(START_DATE)。 – AndySavage

+0

@AndySavage:你可能是对的,我需要改变这种状况。 – dnoeth

相关问题