首页 > 解决方案 > 如何在 SQL 中不嵌套 WHERE 的情况下过滤满足 CASE 条件的用户?

问题描述

现在我有一个查询,让我知道哪些用户在成为会员前 12 个月没有购买。这些用户有 MEM_PRE_12=0,我想使用 SQL 分区更本地地过滤掉这些用户,而不是总是放置基本的 WHERE 标准。

这是我用来查找我想要/不想要的用户的 SQL。

SELECT SUM(CASE WHEN DATE <= DATEADD(month, -12, U.INSERTED_AT) THEN 1 ELSE 0 END) AS MEM_PRE_12, I.CLIENTID, I.INSTALLATIONID
FROM <<<My_Joined_Tables>>>
GROUP BY I.CLIENTID, I.INSTALLATIONID
HAVING MEM_PRE_12 != 0
ORDER BY MEM_PRE_12

在此之后,我将不得不返回并说出上述嵌套查询中 I.CLIENTID 的位置,并从购买时间超过其插入日期的用户那里选择我想要的实际信息。

如果没有这么多的所有这些连接表的嵌套,我怎么能做到这一点?

标签: sqloracle-sqldeveloper

解决方案


如果您想要过去 12 个月内购买的客户的详细行,您可以使用窗口函数:

with q as (
      <whatever your query logic is>
     )
select q.*
from (select q.*,
             SUM(CASE WHEN DATE <= DATEADD(month, -12, U.INSERTED_AT) THEN 1 ELSE 0 END) over (partition by CLIENTID, INSTALLATIONID) as AS MEM_PRE_12
      from q
     ) q
where mem_pre_12 > 0;

推荐阅读