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 TIES
与CASE
语句一起使用。
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
,那么您需要使用额外的CASE
或IIF
或类似的东西来处理它:
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 选择最近的记录(稍加改动)的主要内容,如果未能解决你的问题,请参考以下文章