SQL Server 选择最近的记录(稍加改动)

Posted

技术标签:

【中文标题】SQL Server 选择最近的记录(稍加改动)【英文标题】:SQL Server Select most recent record (with a twist) 【发布时间】:2019-01-30 22:58:58 【问题描述】:

假设我有下表:

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,我想要最旧的操作,因为操作实际上并没有改变。有没有办法同时满足这两个要求?

【问题讨论】:

这不就是 max(date) 的 ActionType 吗?还是有更多的列?在这两种情况下,结果都应该是 Drill,对吗? 实际上,我说错了,我想要 ActionDate。在第一个示例中,我想要最新的 14:36:02,而在第二个示例中,我想要 12:59:56(最旧的) 我不完全理解您的要求。显然,您不仅有三行。为什么空白类型特别?如果相邻行有多个钻怎么办? 【参考方案1】:

您可以将TOP 1 WITH TIESCASE 语句一起使用。

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

这假设空白实际上是NULL,在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

【讨论】:

以上是关于SQL Server 选择最近的记录(稍加改动)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 选择最近的记录以生成更改列表

SQL Server - 如何显示最近的记录

Sql Server 查找下一个最近更改的记录

SQL Server Audit记录数据库变更

sqlserver2008 监控某个表的改动情况

在 SQL Server 中查找最近的日期