Sql 查找值在特定日期范围内但不在其他日期范围内的人

Sql 查找值在特定日期范围内但不在其他日期范围内的人,sql,subquery,Sql,Subquery,我正在查询一个基于用户的数据库,并试图找到仅在某个日期范围内进行购买的人 e、 g: 将仅在'2017-7-01'和'2017-08-01'之间购买但此后未购买的所有人员带回 我试过: select payment_id from table1 where created_at between '2017-7-01' and '2017-08-01' and not between '2017-7-01' and '2017-08-01';

我正在查询一个基于用户的数据库,并试图找到仅在某个日期范围内进行购买的人

e、 g: 将仅在
'2017-7-01'
'2017-08-01'
之间购买但此后未购买的所有人员带回

我试过:

select payment_id 
from table1 
where created_at between '2017-7-01' 
                     and '2017-08-01' 
  and not between '2017-7-01' and '2017-08-01';
还有各种各样的变化。 我想这里应该有一个子查询,但我真的不知道如何处理 希望有人能帮忙:)


感谢使用条件
COUNT()
查看用户是否在该日期范围内有任何购买,并且在上限范围后没有购买

此外,您还需要一些与用户相关的内容,我猜
user\u id
,这样您就可以对所有内容进行分组

SELECT user_id
FROM yourTable
GROUP BY user_id
HAVING COUNT(CASE WHEN created_at between '2017-07-01' 
                                      and '2017-08-01' 
                  THEN 1
             END) > 0
   AND COUNT(CASE WHEN created_at > '2017-08-01' 
                  THEN 1
             END) = 0

使用conditional
COUNT()
查看用户是否在该日期范围内有任何购买,并且在上限范围之后没有购买

此外,您还需要一些与用户相关的内容,我猜
user\u id
,这样您就可以对所有内容进行分组

SELECT user_id
FROM yourTable
GROUP BY user_id
HAVING COUNT(CASE WHEN created_at between '2017-07-01' 
                                      and '2017-08-01' 
                  THEN 1
             END) > 0
   AND COUNT(CASE WHEN created_at > '2017-08-01' 
                  THEN 1
             END) = 0

如果要筛选确保最大(日期)小于2017-08-01,则可以使用
分组依据
拥有

选择付款\u id
来自表1
在“2017-07-01”和“2017-08-01”之间创建
按付款id分组
最大(创建时间)<'2017-08-01'——比要求日期短的最近日期

如果您想过滤以确保最大(日期)小于2017-08-01,那么您可以使用
分组依据
拥有

选择付款\u id
来自表1
在“2017-07-01”和“2017-08-01”之间创建
按付款id分组
最大(创建时间)<'2017-08-01'——比要求日期短的最近日期

您还需要将在“2017-7-01”和“2017-08-01”之间而不是在“2017-7-01”和“2017-08-01”之间创建的_更改为在“2017-7-01”和“2017-08-01”之间创建的_,并在“2017-7-01”和“2017-08-01”之间创建的_,向我们显示数据库模式、样本数据、,当前和预期输出。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。尝试在“我很接近”中创建一个示例:)非常感谢。您还需要将在“2017-7-01”和“2017-08-01”之间而不是在“2017-7-01”和“2017-08-01”之间创建的_更改为在“2017-7-01”和“2017-08-01”之间创建的_,并在“2017-7-01”和“2017-08-01”之间创建的_显示数据库模式、样本数据,当前和预期输出。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。尝试在“我很接近”中创建一个示例:)非常感谢。那不行。因为在内部查询中,您已经过滤了任何无效的
日期>“2017-08-01”
。因为在内部查询中,您已经过滤了任何
日期>“2017-08-01”
谢谢!对于每个用户创建的最大值,这是吗?它是按付款id分组的,因此它是付款id的最大值(创建的)。在发布代码之前,我使用临时表对此进行了测试,它给出了预期的结果。这取决于付款id代表什么,或者您是否需要用户id。。。你在帖子中从来没有提到过用户id,我现在看到了一些关于用户id的答案。如果是这样,应该是
选择用户id
,以及
按用户id分组。没问题,很高兴提供帮助。谢谢!对于每个用户创建的最大值,这是吗?它是按付款id分组的,因此它是付款id的最大值(创建的)。在发布代码之前,我使用临时表对此进行了测试,它给出了预期的结果。这取决于付款id代表什么,或者您是否需要用户id。。。你在帖子中从来没有提到过用户id,我现在看到一些关于用户id的答案。如果是这样,应该是
选择用户id
,以及
按用户id分组
。没问题,很乐意帮助。
Select userid
From table1
Where userid not in (select userid from table1 where createdat between @startdate and @enddate)
Where createdat > @enddate
select payment_id
from table1
where created_at between '2017-07-01' AND '2017-08-01'       
GROUP BY payment_id
HAVING MAX(created_at) < '2017-08-01' --most recent date less than requested date