Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询-隐藏行_Sql_Sql Server - Fatal编程技术网

SQL查询-隐藏行

SQL查询-隐藏行,sql,sql-server,Sql,Sql Server,在我的环境中,我们使用Altiris来控制我们的资产,每天我们都有一个策略,将状态设置为“已停用”以使脱机时间超过45天的计算机处于脱机状态,并在该计算机在网络上联机时返回活动状态 有时(并非所有设备)当策略更改其在数据库上写入的状态时,会出现以下两行问题: 首先是当前状态,然后是新状态: 当设备返回活动状态时也会发生同样的情况,因此,当我尝试汇总数据以了解每月有多少设备被更改为失效或活动时,这个数字没有意义,因为对于某些设备,我们在相同的数据更改上有两行具有两种不同状态的数据 例如: 基本上,

在我的环境中,我们使用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
放在那里。它应该放在那里<代码>最小值(