sql - 选择表中的第二个最小值
问题描述
我有一个如下表,最初我想返回不同状态的最早更新日期。但是,由于项目被取消并重新创建,我想忽略第一个计划日期,只返回第二个计划日期。
+------------+------------+------------+---------- -+ | 项目编号 | 更新DT | 审核 ID | 子状态 | +------------+------------+------------+---------- -+ | 11111 | 2017-12-20 | 10123 | 规划 | | 11111 | 2017-05-25 | 10135 | 规划 | | 11111 | 2017-10-11 | 10254 | 取消 | +------------+------------+------------+---------- -+
我的查询如下所示,但它只能返回最早的计划日期,而不是第二个最早的日期。我添加了一个 CASE 表达式,但结果仍然相同。任何人都可以请点亮一些灯吗?谢谢你。
SELECT DISTINCT sub.Request_ID
,sub.UpdateDT
,a.reqStatus
FROM [RptChange].[dbo].[tRequestsAudit] a
JOIN (
SELECT [reqID] [Request_ID]
,CASE
WHEN [reqStatus] IN ('Cancelled')
THEN MAX([reqUpdateDt])
ELSE MIN([reqUpdateDt])
END AS [UpdateDT]
,MIN([AuditID]) AS EarliestAuditID
,[reqStatus] SubStatus
FROM [RptChange].[dbo].[tRequestsAudit]
WHERE [reqID] = 11111
GROUP BY [reqStatus]
,[reqID]
) sub ON sub.[EarliestAuditID] = a.AuditID
+------------+------------+------------+---------- -+ | 项目编号 | 更新DT | 审核 ID | 子状态 | +------------+------------+------------+---------- -+ | 11111 | 2017-05-25 | 10135 | 规划 | | 11111 | 2017-10-11 | 10254 | 取消 | +------------+------------+------------+---------- -+
我想要的结果:
+------------+------------+------------+---------- -+ | 项目编号 | 更新DT | 审核 ID | 子状态 | +------------+------------+------------+---------- -+ | 11111 | 2017-12-20 | 10123 | 规划 | | 11111 | 2017-10-11 | 10254 | 取消 | +------------+------------+------------+---------- -+
解决方案
这是使用 ROW_NUMBER 解决此问题的一种方法。
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
)
推荐阅读
- bash - 如何在 Typescript 监视消息中显示目标路径?
- c++ - VCPKG Pcl:无法打开包含文件:'pcl/io/vtk_lib_io.h':没有这样的文件或目录
- marklogic - 如何在运行时通过 http:put 方法中的身份验证?
- c# - Blazor Web Assembly 字符串数组的问题
- javascript - “无效的额外参数:token_name” PAYFORT INTEGRATION
- android - android recyclerview 选择跟踪器动态数据
- java - 如何让 Spring Webflux WebSocket 保持活跃
- json - JSON.parse(...).logout 不是 keycloak 中的函数
- r - 按其他列因子聚合列
- javascript - 在 javascript rekursive 中更改 json 属性键的名称以在 postgreSQL 中存储为 json