【问题标题】:SQL Conditional Return HAVINGSQL 条件返回 HAVING
【发布时间】:2019-02-07 21:36:54
【问题描述】:

我找不到可以帮助我返回以下内容的 WHEREHAVING 条件:

如果用户在过去一个月内记录了活动,我想返回这些用户过去六 (6) 个月的记录。到目前为止,我一直在使用以下查询...

SELECT
    USER, 
    CAST(ACTIVITY AS DATE), 
    COUNT(DISTINCT ACTIONS), 
    SUM(RESULTS)
FROM
    TABLE
WHERE 
    ACTIVITY >= DATEADD(MONTH, -6, GETDATE())
GROUP BY 
    [conditions]
ORDER BY 
    [conditions]

我尝试过使用

HAVING 
    (COUNT(USER) * CAST(DATEADD(MONTH, -1, GETDATE()) AS DECIMAL)) > 0

但我收到了来自仅在过去六 (6) 个月内而不是当前或最近一个月内记录过操作的非活动用户的记录返回。

帮忙?!!

提前致谢,

【问题讨论】:

  • 你不能一次完成所有事情,所以把你的目标分解成更小的部分。请记住,没有人了解您的业务或数据库,因此您需要使用其他人理解的术语。第 1 步 - 您如何找到在过去一个月内记录了活动的用户?具体定义应该使用什么逻辑。 “上个月”可以有多种解释方式,它可能取决于执行查询时的当前日期(或其他日期)。
  • 欢迎来到 Stack Overflow!查看How to Askminimal reproducible example,了解如何提高获得有用答案的机会。

标签: sql-server conditional sql-date-functions


【解决方案1】:

您可以将exists 运算符与上个月有活动的用户的子查询一起使用:

SELECT
    USER, 
    CAST(ACTIVITY AS DATE), 
    COUNT(DISTINCT ACTIONS), 
    SUM(RESULTS)
FROM
    TABLE a
WHERE 
    ACTIVITY >= DATEADD(MONTH, -6, GETDATE()) AND 
    EXISTS (SELECT *
            FROM   TABLE b
            WHERE  a.USER = b.USER AND
                   ACTIVITY >= DATEADD(MONTH, -1, GETDATE()))
GROUP BY 
    USER
ORDER BY 
    [conditions]

【讨论】:

  • 如果没有可信赖的表B,这能做到吗?如果用户数据库不可靠,我需要能够基于用户操作来确定现有用户的生存能力。
  • @paaskanama ab同一张表的不同别名。我不确定我明白你在问什么
  • 我明白你现在在说什么了。我在查询中使用了这个 EXISTS 子句,它似乎过滤掉了非活动用户。太棒了!
【解决方案2】:

据我了解,

create table #date ( id int, logdate date)

insert #date values
  (1,'2018-08-03')  -- last month
, (1,'2018-05-03')  -- before 4 month
, (1,'2018-03-03')  -- before 6 month
, (1,'2018-02-03')  -- before 7 month
, (2,'2018-09-03')  -- logged on this month
, (2,'2018-05-03')  -- before 4 month
, (3,'2018-07-03')  -- before 2 month


select *, 'Who logged on before 6 months from last month'
from #date
WHERE DATEPART(m, logdate) <= DATEPART(m, DATEADD(m, -1, getdate()))                        -- logged date on last month
and DATEPART(m, logdate) >= DATEPART(m, DATEADD(m, -6, getdate()))                          -- logged date on before 6 months
and id in (                                                                                 -- 
 select id from #Date where DATEPART(m, logdate) = DATEPART(m, DATEADD(m, -1, getdate()))   -- 
)                                                                                           -- Ids who Logged in past month

/*      User 1, who logged on past month. So query gets his past 6 (3,4,5,6,7,8) month's logged date                    */

如果查询需要更新,请回复我。

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多