如何根据单个表中的两个列值获取 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,为什么还要计数? 为什么要使用DISTINCT
和GROUP BY
?如果您的GROUP BY
尚未返回不同的行集,那么问题出在您的GROUP BY
上。 DISTINCT
和 GROUP BY
通常不应该在同一个查询中,因为它几乎总是指向一个冗余(DISTINCT
)或有缺陷的GROUP BY
子句。此外,person
以p
开头,而不是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 中表中的列值从两个表中获取一个新表: