SQL查询-隐藏行
在我的环境中,我们使用Altiris来控制我们的资产,每天我们都有一个策略,将状态设置为“已停用”以使脱机时间超过45天的计算机处于脱机状态,并在该计算机在网络上联机时返回活动状态 有时(并非所有设备)当策略更改其在数据库上写入的状态时,会出现以下两行问题: 首先是当前状态,然后是新状态: 当设备返回活动状态时也会发生同样的情况,因此,当我尝试汇总数据以了解每月有多少设备被更改为失效或活动时,这个数字没有意义,因为对于某些设备,我们在相同的数据更改上有两行具有两种不同状态的数据 例如: 基本上,我需要但实际上我不能做的是:如果主机名有两个相等的“日期更改”和两个不同的“状态”,则将查询结果带入此主机名和“日期更改”的最后一行 结果如下:SQL查询-隐藏行,sql,sql-server,Sql,Sql Server,在我的环境中,我们使用Altiris来控制我们的资产,每天我们都有一个策略,将状态设置为“已停用”以使脱机时间超过45天的计算机处于脱机状态,并在该计算机在网络上联机时返回活动状态 有时(并非所有设备)当策略更改其在数据库上写入的状态时,会出现以下两行问题: 首先是当前状态,然后是新状态: 当设备返回活动状态时也会发生同样的情况,因此,当我尝试汇总数据以了解每月有多少设备被更改为失效或活动时,这个数字没有意义,因为对于某些设备,我们在相同的数据更改上有两行具有两种不同状态的数据 例如: 基本上,
Nome do computador Date Changed Status
001PROJNEW-VM 13/01/2015 17:33 Active
002PROJNEW-VM 11/09/2014 11:58 Retired
002PROJNEW-VM 07/10/2014 21:10 Active
003PROJNEW-VM 11/09/2014 11:58 Retired
003PROJNEW-VM 13/11/2014 03:27 Active
004PROJNEW-VM 06/04/2015 20:00 Retired
005PROJNEW-VM 11/09/2014 11:58 Retired
005PROJNEW-VM 09/10/2014 21:09 Active
005PROJNEW-VM 06/04/2015 20:00 Retired
006PROJNEW-VM 26/12/2014 20:00 Retired
006PROJNEW-VM 31/12/2014 05:34 Active
006PROJNEW-VM 06/01/2015 20:00 Retired
007PROJNEW-VM 11/09/2014 11:58 Retired
007PROJNEW-VM 27/12/2014 05:38 Active
007PROJNEW-VM 12/04/2015 19:50 Retired
008PROJNEW-VM 11/09/2014 11:58 Retired
008PROJNEW-VM 29/10/2014 05:44 Active
008PROJNEW-VM 06/04/2015 20:00 Retired
009PROJNEW-VM 11/09/2014 11:58 Retired
009PROJNEW-VM 17/09/2014 20:33 Active
009PROJNEW-VM 19/02/2015 20:00 Retired
010PROJNEW-VM 11/09/2014 11:58 Retired
010PROJNEW-VM 29/10/2014 05:44 Active
010PROJNEW-VM 06/04/2015 20:00 Retired
011PROJNEW-VM 05/04/2015 20:00 Retired
013PROJNEW-VM 20/02/2015 20:00 Retired
014PROJNEW-VM 06/04/2015 20:00 Retired
如果日期相同,则没有第一条或最后一条记录,因此假设您只有这两种状态,并且当两行同时存在时,您希望状态始终为
Active
,您可以使用min:
select
ComputerName
DateChanged
min(Status) as Status
from
YourTable
group by
ComputerName
DateChanged
如果更复杂,您可以对行编号和所需状态顺序执行类似的操作。如果日期相同,则没有第一个或最后一个记录,因此假设您只有这两个状态,并且当两行同时存在时,您希望状态始终处于活动状态,您只需使用min即可:
select
ComputerName
DateChanged
min(Status) as Status
from
YourTable
group by
ComputerName
DateChanged
如果更复杂,您可以对行编号和所需状态顺序执行类似的操作。如果日期相同,则没有第一个或最后一个记录,因此假设您只有这两个状态,并且当两行同时存在时,您希望状态始终处于活动状态,您只需使用min即可:
select
ComputerName
DateChanged
min(Status) as Status
from
YourTable
group by
ComputerName
DateChanged
如果更复杂,您可以对行编号和所需状态顺序执行类似的操作。如果日期相同,则没有第一个或最后一个记录,因此假设您只有这两个状态,并且当两行同时存在时,您希望状态始终处于活动状态,您只需使用min即可:
select
ComputerName
DateChanged
min(Status) as Status
from
YourTable
group by
ComputerName
DateChanged
如果更复杂,您可以对行编号和按所需状态顺序排序执行类似的操作。假设您有一个指定排序的
id
列,则可以使用行编号()
在您的特定示例中,所有副本似乎都处于活动状态。如果是这样,那么:
select computername, datechanged,
(case when min(status) = max(status) then min(status)
when sum(case when status = 'Active' then 1 else 0 end) > 0
then 'Active'
else '***Unknown***'
end) as status
from table t
group by computername, datechanged;
假设您有一个指定排序的id
列,那么您可以使用行编号()
在您的特定示例中,所有副本似乎都处于活动状态。如果是这样,那么:
select computername, datechanged,
(case when min(status) = max(status) then min(status)
when sum(case when status = 'Active' then 1 else 0 end) > 0
then 'Active'
else '***Unknown***'
end) as status
from table t
group by computername, datechanged;
假设您有一个指定排序的id
列,那么您可以使用行编号()
在您的特定示例中,所有副本似乎都处于活动状态。如果是这样,那么:
select computername, datechanged,
(case when min(status) = max(status) then min(status)
when sum(case when status = 'Active' then 1 else 0 end) > 0
then 'Active'
else '***Unknown***'
end) as status
from table t
group by computername, datechanged;
假设您有一个指定排序的id
列,那么您可以使用行编号()
在您的特定示例中,所有副本似乎都处于活动状态。如果是这样,那么:
select computername, datechanged,
(case when min(status) = max(status) then min(status)
when sum(case when status = 'Active' then 1 else 0 end) > 0
then 'Active'
else '***Unknown***'
end) as status
from table t
group by computername, datechanged;
您必须为我们提供一个附加列(如id),因为如果两行的日期相同,那么哪一行是最新的?:)SQL表表示无序集。没有“最后”行(或“下一”行或“第二”行),除非另一列指定顺序。@GordonLinoff我的意思正是这样的列:)@GordonLinoff这是一个按计算机名排序的查询结果,日期更改所有“最后”相等的结果在“日期更改”上代表真实状态。您必须给我们一个额外的列(如id),因为如果两行的日期相同,哪一行是最新的SQL表表示无序集。没有“最后”行(或“下一”行或“第二”行),除非另一列指定顺序。@GordonLinoff我的意思正是这样的列:)@GordonLinoff这是一个按计算机名排序的查询结果,日期更改所有“最后”相等的结果在“日期更改”上代表真实状态。您必须给我们一个额外的列(如id),因为如果两行的日期相同,哪一行是最新的SQL表表示无序集。没有“最后”行(或“下一”行或“第二”行),除非另一列指定顺序。@GordonLinoff我的意思正是这样的列:)@GordonLinoff这是一个按计算机名排序的查询结果,日期更改所有“最后”相等的结果在“日期更改”上代表真实状态。您必须给我们一个额外的列(如id),因为如果两行的日期相同,哪一行是最新的SQL表表示无序集。没有“最后”行(或“下一”行或“第二”行),除非另一列指定顺序。@GordonLinoff我的意思正是这样的列:)@GordonLinoff这是一个按计算机名排序的查询结果,日期更改所有“最后”相等的结果在“日期更改”上代表真实状态。(对于可能返回整数或字符串的大小写
表达式,我会非常小心。)重复记录表示旧状态。例如,如果策略将计算机更改为“已失效”,则第一条记录将处于活动状态,第二条记录将处于失效状态,但如果策略将更改为“活动”,则第一条记录将失效,第二条记录将失效active@AaronBertrand…谢谢。我不知道为什么我把1
放在那里。它应该放在那里min(status)
或max(status)
(对于可能返回整数或字符串的大小写
表达式,我要小心。)重复记录表示旧状态。例如,如果策略将计算机更改为“已失效”,则第一条记录将处于活动状态,第二条记录将处于失效状态,但如果策略将更改为“活动”,则第一条记录将失效,第二条记录将失效active@AaronBertrand…谢谢。我不知道为什么我把1
放在那里。它应该放在那里<代码>最小值(