Sql 在给定时间段内,当其他列中的值超过2个时,选择值

Sql 在给定时间段内,当其他列中的值超过2个时,选择值,sql,oracle,Sql,Oracle,我已经尝试了好几天了,但我仍然不知道如何做到这一点,并急于寻求一些想法 例如,我有这样一个表: +------+------------------+--------+ |NAME |WHEN |LOCATION| +------+------------------+--------+ |TOM |17/05/20 00:00:00 |ABC | +------+------------------+--------+ |BOB |17/05/20

我已经尝试了好几天了,但我仍然不知道如何做到这一点,并急于寻求一些想法

例如,我有这样一个表:

+------+------------------+--------+
|NAME  |WHEN              |LOCATION|
+------+------------------+--------+
|TOM   |17/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|BOB   |17/05/20 00:00:00 |ABC     |  
+------+------------------+--------+
|BOB   |17/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
|BOB   |18/05/20 00:00:00 |TRD     |
+------+------------------+--------+
|SAM   |19/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|TOM   |18/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|TOM   |21/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|SAM   |23/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
|BOB   |20/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
+------+------------------+--------+
|NAME  |WHEN              |LOCATION|
+------+------------------+--------+
|BOB   |17/05/20 00:00:00 |ABC     |  
+------+------------------+--------+
|BOB   |17/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
|BOB   |18/05/20 00:00:00 |TRD     |
+------+------------------+--------+
|SAM   |19/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|SAM   |23/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
|BOB   |20/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
我想选择在1周(或任何给定时间段)内访问过2个以上“地点”的任何“名称”。从表中可以看出,由于TOM只去过一个位置,因此不应拾取他,输出应如下所示:

+------+------------------+--------+
|NAME  |WHEN              |LOCATION|
+------+------------------+--------+
|TOM   |17/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|BOB   |17/05/20 00:00:00 |ABC     |  
+------+------------------+--------+
|BOB   |17/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
|BOB   |18/05/20 00:00:00 |TRD     |
+------+------------------+--------+
|SAM   |19/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|TOM   |18/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|TOM   |21/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|SAM   |23/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
|BOB   |20/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
+------+------------------+--------+
|NAME  |WHEN              |LOCATION|
+------+------------------+--------+
|BOB   |17/05/20 00:00:00 |ABC     |  
+------+------------------+--------+
|BOB   |17/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
|BOB   |18/05/20 00:00:00 |TRD     |
+------+------------------+--------+
|SAM   |19/05/20 00:00:00 |ABC     |
+------+------------------+--------+
|SAM   |23/05/20 00:00:00 |XYZ     |
+------+------------------+--------+
|BOB   |20/05/20 00:00:00 |XYZ     |
+------+------------------+--------+

使用
计数尝试以下操作。这是你的电话号码

输出:

|NAME | LOCATION | WHEN |
*-----------------------*
| BOB   ABC       17/05 | 
| BOB   TRD       18/05 | 
| BOB   XYZ       20/05 | 
| BOB   XYZ       17/05 | 
| SAM   ABC       19/05 | 
| SAM   XYZ       23/05 | 
*-----------------------*

尝试下面的代码,它将帮助您

declare @from_date smalldatetime = '2020-05-17'
        ,@to_date smalldatetime ='2020-05-23' 
declare @tab as table(name varchar(50),whn smalldatetime,location varchar(50))

insert into @tab values('TOM','2020-05-17','ABC')
,('BOB','2020-05-17','ABC')
,('BOB','2020-05-17','XYZ')
,('BOB','2020-05-18','TRD')
,('SAM','2020-05-19','ABC')
,('TOM','2020-05-18','ABC')
,('TOM','2020-05-21','ABC')
,('SAM','2020-05-23','XYZ')
,('BOB','2020-05-20','XYZ')

select a.* from @tab  a
inner join
(
select name,count(distinct c.location) cnt from tab c where whn between @from_date and @to_date
group by c.name having count(distinct c.location)>1
) b
on a.name=b.name 
输出

name    whn location
BOB 2020-05-17 00:00:00 ABC
BOB 2020-05-17 00:00:00 XYZ
BOB 2020-05-18 00:00:00 TRD
BOB 2020-05-20 00:00:00 XYZ
SAM 2020-05-23 00:00:00 XYZ
SAM 2020-05-19 00:00:00 ABC

@热心的数据类型是“日期”,我已经简化了这个例子中的日期…如果造成任何混乱,很抱歉。@热心的谢谢,给我的一周将是“每7天”。我的计划是,我会在每个星期一运行这个,并查询过去7天的结果。运行它需要一些时间,但它没有像“TOM”这样的值在output@Phantom在演示中,它没有显示
TOM
。那么你是怎么得到的呢?我要解决这个问题——也许我应该考虑到‘汤姆’也会在1天内不止一次去“ABC”,我在这里忘了提。但是你给了我一个我应该去哪里的想法。谢谢!!似乎还缺少一个条件,即从即将到来的星期一开始向后一周的限制。@热心人希望在此处进行更新。它正在工作,问题是因为我的查询还涉及连接多个表,并且其中一列与另一列的链接不正确。得到了纠正,它给了我预期的输出。谢谢您注意到DBMS被标记为oracle了吗?我没有。谢谢我为SQL server编写了一个查询。