如何解决一个月内重新激活
我需要找到已重新激活一个月的用户。先前已开具发票,然后停止开具发票,然后在该月再次开始开具发票的用户数。下面的查询给了我一个月的期望结果。
SELECT COUNT(DISTINCT USERID)
FROM (
SELECT USERID,MIN(DATE ( INVOICE_DT)) AS ADD_ON_GA_DATE
FROM INVOICE_D AS ID
WHERE
USERID IN (
(
SELECT USERID
FROM INVOICE_D AS ID
WHERE INVOICE_AMT > 0
AND LAST_DAY(INVOICE_DT) = ADD_MONTHS(LAST_DAY(CURRENT_DATE - 1),- 1)
GROUP BY USERID
)
MINUS
(SELECT USERID
FROM INVOICE_D AS ID
WHERE LAST_DAY(INVOICE_DT) = ADD_MONTHS(LAST_DAY(CURRENT_DATE - 1),- 2)
GROUP BY USERID)
)
GROUP BY USERID
) AS TOTAL_POP
WHERE LAST_DAY(ADD_ON_GA_DATE) != ADD_MONTHS(LAST_DAY(CURRENT_DATE - 1),- 1)
;
我希望此查询计算除当前月份(2020年9月除外)以外的所有月份。这为我提供了所有月份的数据,其中用户在当月而不是上个月处于活动状态。现在,从该列表中,我只希望那些在所有较旧月份以及当前月份都处于活动状态的用户。不确定在哪里需要添加过滤器以排除当前月份。
WITH MONTH_SUMMARY AS
(
SELECT USERID,TO_CHAR(INVOICE_DT,'YYYY-MM') "INVOICE_MONTH",TO_CHAR(ADD_MONTHS(INVOICE_DT,-1),'YYYY-MM') "PREV_MONTH",SUM(INVOICE_AMT) "MONTHLY_TOTAL"
FROM INVOICE_DATA
WHERE INVOICE_DT >= TRUNC(ADD_MONTHS(current_date(),-13),'MONTH')
GROUP BY 1,2,3
),USER_DATA AS
(
SELECT USERID,INVOICE_MONTH,MONTHLY_TOTAL
FROM MONTH_SUMMARY MS_THIS
WHERE NOT EXISTS
(
SELECT USERID
FROM MONTH_SUMMARY MS_NEXT
WHERE
MS_THIS.USERID = MS_NEXT.USERID AND
MS_THIS.NEXT_MONTH = MS_NEXT.INVOICE_MONTH
)
AND MS_THIS.INVOICE_MONTH < TO_CHAR(current_date(),'YYYY-MM')
)
SELECT INVOICE_MONTH,COUNT(DISTINCT USERID) "USER_COUNT"
FROM USER_DATA
GROUP BY INVOICE_MONTH
ORDER BY INVOICE_MONTH
;
解决方法
此SQL可能应该使您接近所需的内容:
-- Create a CTE that holds monthly summaries per user; adjust as necessary to hold the data required in the final output
-- Last day of month used,rather than just the month,to make subsequent date logic easier
WITH MONTHLY_SUMMARY AS (
SELECT USERID,LAST_DAY(INVOICE_DT) AS INVOICE_MONTH,SUM(INVOICE_AMT) MONTHLY_AMT
FROM INVOICE_D
GROUP BY 1,2
HAVING MONTHLY_AMT > 0 -- Only include user/month combinations that have an invoice amount. Only required if zero-value invoices exists. Would need adjusting if +ve and -ve amounts exist that could sum to zero
)
--Main select
SELECT THIS_MONTH.INVOICE_MONTH,THIS_MONTH.USERID,THIS_MONTH.MONTHLY_AMT
FROM MONTHLY_SUMMARY THIS_MONTH
WHERE NOT EXISTS ( -- exclude records where there is an invoice amount for the same user in the previous month
SELECT 1 FROM MONTHLY_SUMMARY LAST_MONTH
WHERE THIS_MONTH.USERID = LAST_MONTH.USERID
AND ADD_MONTHS(THIS_MONTH.INVOICE_MONTH,-1) = LAST_MONTH.INVOICE_MONTH
)
AND EXISTS ( -- include records where there is an invoice amount for the same user in month 2,or more,priior to this month
SELECT 1 FROM MONTHLY_SUMMARY LAST_MONTH
WHERE THIS_MONTH.USERID = LAST_MONTH.USERID
AND LAST_MONTH.INVOICE_MONTH <= ADD_MONTHS(THIS_MONTH.INVOICE_MONTH,-2)
)
AND LAST_DAY(CURRENT_DATE) > THIS_MONTH.INVOICE_MONTH -- EXCLUDE THE CURRENT MONTH
AND THIS_MONTH.INVOICE_MONTH <> (SELECT MIN(INVOICE_MONTH) FROM MONTHLY_SUMMARY) -- Exclude 1st month in dataset
ORDER BY THIS_MONTH.INVOICE_MONTH,THIS_MONTH.USERID
;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。