【问题标题】:SQL - How to check if data exists on all available dates?SQL - 如何检查所有可用日期是否存在数据?
【发布时间】:2021-09-23 05:17:26
【问题描述】:

我对 SQL 有点陌生。有没有可能的方法来检查用户名是否存在于某个时间范围内。

假设 TableExample 在 2021 年 4 月 1 日至 4 月 3 日之间有 4 个用户名时间范围(日期)。如何检查每个可用日期时间存在的用户名?

username type date
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

username type date
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

【问题讨论】:

  • 你能告诉我们你尝试了什么吗?在我看来,WHERE date BETWEEN ... AND ... GROUP BY username, date HAVING COUNT(date) = 3 是可能的,但只是头脑风暴 - 需要测试
  • 您需要不同的 uname 或不同的日期吗?如果不是,那么按照 urban 建议的简单查询就可以完成您的工作。
  • 嗨@urban & @swapnil bandiwadekar 感谢您的回答!我一直在尝试做的是这样的select distinct username, case when date between '2021-04-01' and '2021-04-03' then 1 else 0 end as username_is_exist from SQLTutorial..testrun1 where username is not null group by username, date 但输出仍然显示每个 uname "1" 而不是 uname1 & uname4 "1" 然后是 uname2、3、5 和 6 "0"
  • 用您正在使用的数据库标记您的问题。

标签: sql tsql ssms


【解决方案1】:

您可以将聚合与 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

请注意,这将返回用户名。如果您确实需要详细信息行,请在使用 join 或类似构造的查询中使用它来获取原始行。

【讨论】:

    【解决方案2】:
    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 语句,然后向您显示在给定时间谁在数据中和谁不在数据中。

    【讨论】:

      【解决方案3】:

      包含准确数据的表格:

      添加一列名为RN(Row_Number) order by 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;
      

      按原样运行上面的代码。您将得到您在问题中提到的确切答案。参考下图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 2018-08-17
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        相关资源
        最近更新 更多