sql - 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,我想要最旧的操作,因为操作实际上并没有改变。有没有办法同时满足这两个要求?
解决方案
您可以使用TOP 1 WITH TIES
withCASE
语句。
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
那么你需要用额外的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
推荐阅读
- python - PIL:如何使用 ImageGrab 获得全范围的颜色
- java - 如何使用 onClick 侦听器将字符串从 TextView 传输到主要活动
- azure - 使用 Azure AD auth 对 Azure SQL DB 的基于令牌的身份验证支持
- python - Python Numpy在其他数组给出的索引上优化计算数组的平均值
- ios - 为什么我不能从代码中自动调整 UILabel 的文本,但我可以通过 IB?
- linux - 在 Openshift 中,jboss 覆盖来自 JAVA_OPTS 的堆内存集
- git - 排除“检测到的大文件”并遵循例程 no git/github
- node.js - 计算机可以将相同的浮点数四舍五入到两个不同的方向吗?
- c - 如何正确实现这个创建功能?
- azure - Azure datafactory v2 使用 For Each 执行管道