Sql 选择表中的第二个最小值

Sql 选择表中的第二个最小值,sql,sql-server,Sql,Sql Server,我有一个如下表,最初我想返回不同状态的最早更新日期。 但是,由于项目被取消并重新创建,我想忽略第一个计划日期,只返回第二个计划日期 +------------+------------+------------+-----------+ | Project ID | UpdateDT | Audit ID | SubStatus | +------------+------------+------------+-----------+ | 11111 | 2017-12-20

我有一个如下表,最初我想返回不同状态的最早更新日期。 但是,由于项目被取消并重新创建,我想忽略第一个计划日期,只返回第二个计划日期

+------------+------------+------------+-----------+ | Project ID | UpdateDT | Audit ID | SubStatus | +------------+------------+------------+-----------+ | 11111 | 2017-12-20 | 10123 | Planning | | 11111 | 2017-05-25 | 10135 | Planning | | 11111 | 2017-10-11 | 10254 | Cancelled | +------------+------------+------------+-----------+ 我想要的结果是:

+------------+------------+------------+-----------+ | Project ID | UpdateDT | Audit ID | SubStatus | +------------+------------+------------+-----------+ | 11111 | 2017-12-20 | 10123 | Planning | | 11111 | 2017-10-11 | 10254 | Cancelled | +------------+------------+------------+-----------+
这里有一种使用ROW_编号解决此问题的方法

declare @tRequestsAudit table
(
    ProjectID int
    , UpdateDT date
    , AuditID int
    , SubStatus varchar(10)
)

insert @tRequestsAudit values
(11111, '2017-12-20', 10123, 'Planning')
, (11111, '2017-05-25', 10135, 'Planning')
, (11111, '2017-10-11', 10254, 'Cancelled')
;

select ProjectID
    , UpdateDT
    , AuditID
    , SubStatus
from
(
    select *
        , RowNum = ROW_NUMBER()over(partition by ProjectID, SubStatus order by UpdateDT desc)
    from @tRequestsAudit
) x
where x.SubStatus <> 'Planning'
OR
(
    x.SubStatus = 'Planning'
    AND
    x.RowNum = 2
)

这里有一种使用ROW_编号解决此问题的方法

declare @tRequestsAudit table
(
    ProjectID int
    , UpdateDT date
    , AuditID int
    , SubStatus varchar(10)
)

insert @tRequestsAudit values
(11111, '2017-12-20', 10123, 'Planning')
, (11111, '2017-05-25', 10135, 'Planning')
, (11111, '2017-10-11', 10254, 'Cancelled')
;

select ProjectID
    , UpdateDT
    , AuditID
    , SubStatus
from
(
    select *
        , RowNum = ROW_NUMBER()over(partition by ProjectID, SubStatus order by UpdateDT desc)
    from @tRequestsAudit
) x
where x.SubStatus <> 'Planning'
OR
(
    x.SubStatus = 'Planning'
    AND
    x.RowNum = 2
)

如果您使用的是SQL 2012及更高版本,则可以使用lead功能删除后来取消的计划记录。此查询假设计划和取消的顺序如下:

select a.*
from
(select *,lead(Substatus,1) Over(Partition by [Project ID] Order by UpdateDt) as lead_status
from [RptChange].[dbo].[tRequestsAudit])a
where a.lead_status!='Cancelled'

如果您使用的是SQL 2012及更高版本,则可以使用lead功能删除后来取消的计划记录。此查询假设计划和取消的顺序如下:

select a.*
from
(select *,lead(Substatus,1) Over(Partition by [Project ID] Order by UpdateDt) as lead_status
from [RptChange].[dbo].[tRequestsAudit])a
where a.lead_status!='Cancelled'

如果有3个计划日期,您想要第三个还是第二个?如果有多个记录处于取消状态,该怎么办?您想全部显示还是只选择其中一个?@GMB如果有多条记录处于计划状态,我将选择最早的一条,但必须在取消状态之后。如果有3个计划日期,您想要第三个还是第二个?如果有多条记录处于取消状态,该怎么办?是全部显示还是只选择一条?@GMB如果有多条记录处于计划状态,我会选择最早的一条,但必须在取消状态之后。