首页 > 解决方案 > 根据条件计算 maxdate

问题描述

(抱歉,如果我没有正确格式化问题,这是我的第一篇文章)。

我有以下示例数据:

a.label |   b.recipient_id| b.action|b.creation_date  
Books | Recipient1 |    0 | 01/04/2018  
Books | Recipient1 |    1 | 02/04/2018  
Books | Recipient1 |    0 | 03/04/2018  
Books | Recipient1 |    1 | 04/04/2018  
Books | Recipient2 |    1 | 05/04/2018  
Books | Recipient2 |    0 | 06/04/2018  
Books | Recipient2 |    0 | 07/04/2018  
Books | Recipient2 |    1 | 08/04/2018  
Books | Recipient3 |    1 | 13/04/2018  
Books | Recipient3 |    0 | 14/04/2018  
Books | Recipient3 |    1 | 15/04/2018  
Books | Recipient3 |    0 | 16/04/2018  

我想计算 max(creation_date) action = 1 的接收者 ID

如果 max(creation_date) action 等于 0,我根本不想计算这个收件人。

所以在我上面的示例数据中,我想计算 Recipient1 和 Recipient2 但不计算 Recipient3。

我尝试了以下变化,但到目前为止没有任何效果

SELECT count(b.recipient_id)
FROM Services a, Subscriptions b,
(SELECT recipient_id,MAX(creation_date)
FROM Subscriptions
GROUP BY recipient_id) c
WHERE a.SERVICE_ID = b.SERVICE_ID
AND b.recipient_id = c.recipient_id
AND b."ACTION" = '1'
AND a.LABEL = 'Books'

提前致谢

标签: sqlconditional-statementsmaxdate

解决方案


这是一种方法,使用两个级别的聚合:

select count(*)
from (select su.recipient_id
      from services se join
           subscriptions su
           on se.service_id = su.service_id
      where se.label = 'BOOKS'
      group by su.recipient_id
      having max(su.creation_date) = max(case when su.action = 1 then su.creation_date)
     ) ss;

having子句检查最终状态是否为1

笔记:

  • 切勿FROM子句中使用逗号。
  • 始终使用正确、明确、标准 JOIN的语法。
  • 使用有意义的表别名,例如表名的缩写,而不是任意字母。
  • 使用单引号来分隔字符串。如果有必要,可以使用双引号来转义标识符。

推荐阅读