选择当一个字段中的一个字段对应字段的最大值为何时

时间:2014-07-16 20:45:23

标签: sql

如果我有一个表“table1”,列是:

EMAIL | USER_ID | START_DATE | CANCEL_DATE

如果有人注册我们的数据库,他们会出现一次。如果他们取消了他们的帐户,那么他们会再次出现并填充CANCEL_DATE - 这样两次。如果他们然后重新订阅,他们会出现3次,新记录会有一个新的START_DATE。

因此该表位于订阅而非帐户级别。

如果我想提取已取消的人的电子邮件地址和用户ID列表,并且自重新订阅后我不需要(以简单的英语):

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

    如果是excel,我会针对取消日期列的最大开始日期进行vlookup。

    希望我有意义吗?

    • 后来补充道。我还需要添加条件,即最终结果应该只包括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
    

1 个答案:

答案 0 :(得分: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)

这会返回所有当前已取消的订阅者。