SQL - 如何检查所有可用日期的数据是否存在?
SQL - How to check if data exists on all available dates?
我是 SQL 的新手。有没有一种可能的方法来检查用户名在特定时间范围内是否存在。
假设有 4 个用户名 和 时间范围(日期) 2021 年 4 月 1 日至 4 月 3 日从 表格示例。如何检查每个可用日期时间存在的用户名?
用户名
类型
日期
uname1
1
2021-04-01
uname2
2
2021-04-01
uname3
2
2021-04-01
uname4
1
2021-04-01
uname1
2
2021-04-02
uname3
2
2021-04-02
uname4
2
2021-04-02
uname1
1
2021-04-03
uname2
2
2021-04-03
uname4
2
2021-04-03
预期输出将是 uname1 和 uname4
用户名
类型
日期
uname1
1
2021-04-01
uname4
1
2021-04-01
uname1
2
2021-04-02
uname4
2
2021-04-02
uname1
1
2021-04-03
uname4
2
2021-04-03
SELECT username, type, date
FROM yourtable
WHERE date >= '2021-04-01' and date <= '2021-04-03'
将为您提供特定时间范围内的所有行。
您是否正在寻找您想要执行的用户汇总列表:
SELECT DISTINCT username
FROM yourtable
WHERE date >= '2021-04-01' and date <= '2021-04-03'
如果要检查特定用户名,可以将 username = xxx 添加到 WHERE 语句中。如果你想收到一个列表,列出谁和谁不在,你可以创建一个嵌套的 select / join 语句,然后显示给定时间谁在数据中,谁不在数据中。
您可以将聚合与 having
子句一起使用:
select username
from t
where date >= '2021-04-01' and date < '2021-04-04'
group by username
having count(*) = 3; -- user name appears on all three days
请注意,此 returns 用户名。如果您确实需要详细信息行,请在使用 join
或类似构造的查询中使用它来获取原始行。
Table 准确你的数据:
添加一列名为 RN(Row_Number)
按 Date
排序。
https://i.stack.imgur.com/eCdJJ.png
确保您必须只选择 RN 列。以下是未来的完全动态查询:
Declare @d date, @un varchar(20) , @t int,
@min int = 1 , @max int = (Select max(RN) from TableExample),
@count int = 0
Create table #UN(username varchar(20),type int, Dates date)
Select ROW_NUMBER() over(order by Date) SrNo , Date into #Dates from (
Select distinct Date from TableExample
) as A
Declare @m int =1 , @mx int=(Select max(SrNo) from #Dates), @dd date
while(@min <= @max)
Begin
Select @d = date, @un = username, @t = type from TableExample where RN = @min
while(@m <= @mx)
Begin
Select @dd = date from #Dates where SrNo= @m;
if exists(Select Date from TableExample where Date = @dd and username = @un)
Begin
set @count = @count + 1
End
set @m = @m + 1;
if(@count = @mx)
Begin
insert into #UN values(@un,@t,@d)
End
End
set @m = 1 ;
set @count = 0;
set @min = @min + 1
End
Select * from #UN;
Drop table #UN;
Drop table #Dates;
直接运行上面的代码就可以了。您将得到您在问题中提到的确切答案。参考下图。
我是 SQL 的新手。有没有一种可能的方法来检查用户名在特定时间范围内是否存在。
假设有 4 个用户名 和 时间范围(日期) 2021 年 4 月 1 日至 4 月 3 日从 表格示例。如何检查每个可用日期时间存在的用户名?
用户名 | 类型 | 日期 |
---|---|---|
uname1 | 1 | 2021-04-01 |
uname2 | 2 | 2021-04-01 |
uname3 | 2 | 2021-04-01 |
uname4 | 1 | 2021-04-01 |
uname1 | 2 | 2021-04-02 |
uname3 | 2 | 2021-04-02 |
uname4 | 2 | 2021-04-02 |
uname1 | 1 | 2021-04-03 |
uname2 | 2 | 2021-04-03 |
uname4 | 2 | 2021-04-03 |
预期输出将是 uname1 和 uname4
用户名 | 类型 | 日期 |
---|---|---|
uname1 | 1 | 2021-04-01 |
uname4 | 1 | 2021-04-01 |
uname1 | 2 | 2021-04-02 |
uname4 | 2 | 2021-04-02 |
uname1 | 1 | 2021-04-03 |
uname4 | 2 | 2021-04-03 |
SELECT username, type, date
FROM yourtable
WHERE date >= '2021-04-01' and date <= '2021-04-03'
将为您提供特定时间范围内的所有行。
您是否正在寻找您想要执行的用户汇总列表:
SELECT DISTINCT username
FROM yourtable
WHERE date >= '2021-04-01' and date <= '2021-04-03'
如果要检查特定用户名,可以将 username = xxx 添加到 WHERE 语句中。如果你想收到一个列表,列出谁和谁不在,你可以创建一个嵌套的 select / join 语句,然后显示给定时间谁在数据中,谁不在数据中。
您可以将聚合与 having
子句一起使用:
select username
from t
where date >= '2021-04-01' and date < '2021-04-04'
group by username
having count(*) = 3; -- user name appears on all three days
请注意,此 returns 用户名。如果您确实需要详细信息行,请在使用 join
或类似构造的查询中使用它来获取原始行。
Table 准确你的数据:
添加一列名为 RN(Row_Number)
按 Date
排序。
确保您必须只选择 RN 列。以下是未来的完全动态查询:
Declare @d date, @un varchar(20) , @t int,
@min int = 1 , @max int = (Select max(RN) from TableExample),
@count int = 0
Create table #UN(username varchar(20),type int, Dates date)
Select ROW_NUMBER() over(order by Date) SrNo , Date into #Dates from (
Select distinct Date from TableExample
) as A
Declare @m int =1 , @mx int=(Select max(SrNo) from #Dates), @dd date
while(@min <= @max)
Begin
Select @d = date, @un = username, @t = type from TableExample where RN = @min
while(@m <= @mx)
Begin
Select @dd = date from #Dates where SrNo= @m;
if exists(Select Date from TableExample where Date = @dd and username = @un)
Begin
set @count = @count + 1
End
set @m = @m + 1;
if(@count = @mx)
Begin
insert into #UN values(@un,@t,@d)
End
End
set @m = 1 ;
set @count = 0;
set @min = @min + 1
End
Select * from #UN;
Drop table #UN;
Drop table #Dates;
直接运行上面的代码就可以了。您将得到您在问题中提到的确切答案。参考下图。