【问题标题】:How to get 1 record on the basis of two column values in a single table?如何根据单个表中的两个列值获取 1 条记录?
【发布时间】:2020-08-27 12:14:59
【问题描述】:

查询是

select distinct b.UserID , cast(b.entrytime as date) ,count(*) as UserCount
from [dbo].[person] as a
join [dbo].[personcookie] as b
on a.UserID = b.UserID
where cast (b.entrytime as date) >= '08/21/2020'
and cast (b.leavetime as date) <= '08/27/2020' and a.distinction = 99
group by cast(b.entrytime as date), b.UserID

如果相同的 UserID 在同一日期的计数超过 1,则应视为 1。现在如图所示,USERID 10 在 2020-08-26 的计数为 1 USERID 10 的计数为 2 '2020-08-27'。根据要求。 我添加了表格的图像和我想要的输出

【问题讨论】:

  • 如果计数始终为 1,为什么还要计数?
  • 为什么要使用DISTINCTGROUP BY?如果您的GROUP BY 尚未返回不同的行集,那么问题出在您的GROUP BY 上。 DISTINCTGROUP BY 通常不应该在同一个查询中,因为它几乎总是指向一个冗余(DISTINCT)或有缺陷的GROUP BY 子句。此外,personp 开头,而不是a(它甚至没有a)。 Bad Habits to Kick : Using table aliases like (a, b, c) or (t1, t2, t3)
  • 因为有多天数据,如果同一用户多次登录,则单日数据应视为 1。但如果同一用户每天都登录,则计数会增加。
  • 将您的输出写入 excel 并请在问题中更新。在当前所需的输出中,第二列中的值应该是多少
  • @SowmyadharGourishetty 解释图片附后。请看

标签: sql sql-server select


【解决方案1】:

您似乎希望每个用户有一个结果行,因此按用户分组,而不是按用户和日期。您想计算每个用户的日期,但每天只计算一次。这是一个不同的计数。

select 
  p.userid,
  count(distinct cast(pc.entrytime as date)) as date_count
from dbo.person as p
join dbo.personcookie as pc on pc.userid = p.userid
where p.distinction = 99
  and pc.entrytime >= '2020-08-08'
  and pc.leavetime < '2020-08-28'
group by p.userid
order by p.userid;

【讨论】:

    【解决方案2】:

    你似乎想要dense_rank()

    select p.UserID, cast(pc.entrytime as date), 
           dense_rank() over (partition by p.userID order by min(pc.entrytime)) as usercount
    from [dbo].[person] p join
         [dbo].[personcookie] pc
         on pc.UserID = p.UserID
    where cast(pc.entrytime as date) >= '2020-08-21' and
          cast(pc.leavetime as date) <= '2020-08-27'
    group by cast(pc.entrytime as date), p.UserID;
    

    注意事项:

    • 唯一“真正”的变化是使用dense_rank(),它会枚举给定用户的天数。
    • 使用有意义的表别名,而不是任意字母。
    • 使用标准日期/时间常数。在 SQL Server 中,即 YYYYMMDD 或 YYYY-MM-DD。

    【讨论】:

    • 结果与我在附图中显示的相同。如果有多天数据,如果同一用户多次登录,则应将其视为 1。但如果同一用户每天登录,则计数将增加,就像 USERID 10 为今天和昨天登录一样UserID 10 的计数应为 2。
    • 您的要求不明确。能否提供样本数据和预期结果?
    • @SowmyadharGourishetty 。 . .我花了一些时间,但 OP 基本上想枚举某人输入的日期,而不是计算给定日期的数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2020-04-08
    • 2018-10-29
    • 2018-08-27
    • 2015-02-15
    相关资源
    最近更新 更多