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

预期输出将是 uname1uname4

用户名 类型 日期
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;

直接运行上面的代码就可以了。您将得到您在问题中提到的确切答案。参考下图。