首页 > 解决方案 > SQL Server 选择最近的记录(稍加改动)

问题描述

假设我有下表:

ActionDate                  ActionType
------------                ------------
2018-08-02 12:59:56.000     Drill
2018-08-02 13:20:45.000     Hammer
2018-08-02 14:36:02.000     Drill

我想根据 ActionDate 选择最新的 ActionType。这不是问题,使用 ROW_NUMBER() OVER 语法并根据我的排序方式抓取第一条或最后一条记录。但是考虑这个表设置:

ActionDate                  ActionType
------------                ------------
2018-08-02 12:59:56.000     Drill
2018-08-02 13:20:45.000     
2018-08-02 14:36:02.000     Drill

在这种情况下,由于列出的唯一操作是 Drill,我想要最旧的操作,因为操作实际上并没有改变。有没有办法同时满足这两个要求?

标签: sqlsql-server-2008greatest-n-per-group

解决方案


您可以使用TOP 1 WITH TIESwithCASE语句。

select top 1 with ties
    *
from YourTable
order by
    case 
        when (select count(distinct ActionType) from @table) = 1 
        then row_number() over (order by ActionDate asc) 
        else row_number() over (order by ActionDate desc)
    end

或者在子查询中,如果您更喜欢...

select ActionDate, ActionType
from
    (select
        *, 
        RN = case 
                when (select count(distinct ActionType) from @table) = 1 
                then row_number() over (order by ActionDate asc) 
                else row_number() over (order by ActionDate desc)
            end
    from YourTable) x
where RN = 1

这假设空白实际上是 aNULL在 中被忽略COUNT DISTINCT。如果那是一个空格而不是NULL那么你需要用额外的CASEIIF类似的东西来处理它:

select top 1 with ties
    *
from YourTable
order by
    case 
        when (select count(distinct case when ActionType = '' then null else ActionType end) from @table) = 1 
        then row_number() over (order by ActionDate asc) 
        else row_number() over (order by ActionDate desc)
    end

推荐阅读