统计过滤掉某个条件的记录数
Posted
技术标签:
【中文标题】统计过滤掉某个条件的记录数【英文标题】:Counting number of records filtering out a certain condition 【发布时间】:2013-03-21 15:51:53 【问题描述】:我正在尝试计算表中只有一个会话的唯一事件的数量。我们有一个名为 Session Tracking 的表,它存储事件编号,还存储该会话的先前状态和当前状态。我想计算只有一个会话的事件数量,并且我还想计算可能有多个会话的事件数量,但前提是以下会话开始于关闭并结束于关闭。基本上不计算在聚合列表中不改变状态的会话。
例子:
Incident ID Start Status End Status
1 Open Closed
1 Closed Closed
2 Open Closed
3 Open Closed
4 Open Open
4 Open Closed
我想获取前三个事件,因为事件 2 和 3 都只有一个会话,并且想要计算第一个事件,因为它在它已经关闭之后还有一个会话,而第二个会话不计算在内。第四个事件不会被计算在内,因为它有不止一个会话处于打开状态。
这是我正在使用的语句,并且认为可能有问题......
SELECT Incident, COUNT(Incident)
FROM Session_Tracking
WHERE NOT (Prev_Status = 'Closed' AND Current_Status = 'Closed')
GROUP BY Incident
HAVING COUNT(Incident) = 1
【问题讨论】:
当您运行此查询时,您会得到什么结果? 我得到了一个事件和 1 的列表,但是与没有 WHERE 子句的情况相比,我得到了相互冲突的数字。一个月我得到的数字比使用 WHERE 子句的总会话数少,下个月我得到的数字更多。很奇怪,所以想在这里问问有没有更好的办法……而且我用的是Microsoft SQL Server 【参考方案1】:假设您使用的是支持窗口函数的合理数据库,您可以通过计数来做到这一点:
select SUM(case when numInIncident = 1 then 1 else 0 end) as Singletons,
SUM(case when ClosedClosed = numInIncident - 1 and numInINcident > 1 then 1 else 0
end) as RestClosed
from (select st.*,
COUNT(*) over (partition by incident) as numInIncident,
sum(case when startStatus = 'Closed' and endStatus = 'Closed' then 1 else 0 end) over (partition by incident) as ClosedClosed
from session_tracking
) st
内部子查询计算每个事件的行数,以及当开始和结束状态都为“关闭”时的行数。外部查询应用此逻辑来获取您想要的数字。
【讨论】:
以上是关于统计过滤掉某个条件的记录数的主要内容,如果未能解决你的问题,请参考以下文章
mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留