如何根据单个表中的两个列值获取 1 条记录?

Posted

技术标签:

【中文标题】如何根据单个表中的两个列值获取 1 条记录?【英文标题】:How to get 1 record on the basis of two column values in a single table? 【发布时间】: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 解释图片附后。请看 【参考方案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 基本上想枚举某人输入的日期,而不是计算给定日期的数字。

以上是关于如何根据单个表中的两个列值获取 1 条记录?的主要内容,如果未能解决你的问题,请参考以下文章

根据 SQL Server 中表中的列值从两个表中获取一个新表:

如何比较两个数据表并使用多个线程更新第一个数据表?

Datatable C# - 如何根据 ID 从一个表中获取详细记录及其关联的另一表中的子记录

选择 PL/SQL 中两个非空列值之间的行集

sql数据库中的两个表的记录进行比较!并将结果写入表中!

根据 Pandas 中的公共列值合并两个数据框