如何根据执行日期和执行时间列获取记录?
How to get record based on Exec Date and Exec Time column?
我想获取基于执行日期和执行时间列的最新记录。
执行日期列的类型是日期时间。执行时间列的类型是 varchar。
但是,由于不在同一列,我无法进行筛选。
可以用SQL吗?
例子
数据
RN_TEST_ID | RN_RUN_ID | RN_EXECUTION_DATE | RN_EXECUTION_TIME | ST_STATUS
585858 | 214566 | 2022-04-04 00:00:00 | 16:30:12 | P
585858 | 214566 | 2022-04-04 00:00:00 | 16:30:12 | N
585858 | 214566 | 2022-04-04 00:00:00 | 16:30:12 | N
585858 | 214566 | 2022-04-04 00:00:00 | 16:30:12 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | F
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | F
124578 | 852369 | 2022-04-06 00:00:00 | 12:20:01 | P
124578 | 852369 | 2022-04-06 00:00:00 | 12:20:01 | P
124578 | 852369 | 2022-04-06 00:00:00 | 12:20:01 | P
124578 | 852369 | 2022-04-06 00:00:00 | 12:20:01 | P
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | N
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
预期结果
RN_TEST_ID | RN_RUN_ID | RN_EXECUTION_DATE | RN_EXECUTION_TIME | ST_STATUS
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | F
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | N
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
你能帮我得到这个结果吗?
非常感谢。
更新 1
因为我无法在 HPALM 中查询时使用 CTE,所以我尝试使用子请求。
SELECT RN_TEST_ID, RN_RUN_ID, RN_EXECUTION_DATE, RN_EXECUTION_TIME, ST_STATUS
FROM (
SELECT RANK() OVER (PARTITION BY RN_TEST_ID ORDER BY RN_EXECUTION_DATE, RN_EXECUTION_TIME) AS DR, RUN.*
FROM RUN
) AS REQ
INNER JOIN STEP ON REQ.RN_RUN_ID = STEP.ST_RUN_ID
WHERE DR = 1 AND REQ.RN_ASSIGN_RCYC = '1100'.
但是,我获取所有记录而不是获取每个 TEST_ID 的最新记录(基于执行日期和执行时间),我不明白为什么...
你能帮帮我吗?
此处使用RANK
:
WITH cte AS (
SELECT *, RANK() OVER (PARTITION BY RN_TEST_ID
ORDER BY RN_EXECUTION_DATE DESC, RN_EXECUTION_TIME DESC) rnk
FROM yourTable
)
SELECT RN_TEST_ID, RN_RUN_ID, RN_EXECUTION_DATE, RN_EXECUTION_TIME, ST_STATUS
FROM cte
WHERE rnk = 1;
请注意,通常最好将日期和时间存储为单个 datetime/timestamp 列。您可能希望在某个时候更改您的设计。
我想获取基于执行日期和执行时间列的最新记录。
执行日期列的类型是日期时间。执行时间列的类型是 varchar。
但是,由于不在同一列,我无法进行筛选。
可以用SQL吗?
例子
数据
RN_TEST_ID | RN_RUN_ID | RN_EXECUTION_DATE | RN_EXECUTION_TIME | ST_STATUS
585858 | 214566 | 2022-04-04 00:00:00 | 16:30:12 | P
585858 | 214566 | 2022-04-04 00:00:00 | 16:30:12 | N
585858 | 214566 | 2022-04-04 00:00:00 | 16:30:12 | N
585858 | 214566 | 2022-04-04 00:00:00 | 16:30:12 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | F
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | F
124578 | 852369 | 2022-04-06 00:00:00 | 12:20:01 | P
124578 | 852369 | 2022-04-06 00:00:00 | 12:20:01 | P
124578 | 852369 | 2022-04-06 00:00:00 | 12:20:01 | P
124578 | 852369 | 2022-04-06 00:00:00 | 12:20:01 | P
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | N
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
预期结果
RN_TEST_ID | RN_RUN_ID | RN_EXECUTION_DATE | RN_EXECUTION_TIME | ST_STATUS
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | P
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | F
585858 | 963247 | 2022-04-04 00:00:00 | 17:51:15 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | N
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
124578 | 148623 | 2022-04-07 00:00:00 | 10:51:48 | F
你能帮我得到这个结果吗?
非常感谢。
更新 1
因为我无法在 HPALM 中查询时使用 CTE,所以我尝试使用子请求。
SELECT RN_TEST_ID, RN_RUN_ID, RN_EXECUTION_DATE, RN_EXECUTION_TIME, ST_STATUS
FROM (
SELECT RANK() OVER (PARTITION BY RN_TEST_ID ORDER BY RN_EXECUTION_DATE, RN_EXECUTION_TIME) AS DR, RUN.*
FROM RUN
) AS REQ
INNER JOIN STEP ON REQ.RN_RUN_ID = STEP.ST_RUN_ID
WHERE DR = 1 AND REQ.RN_ASSIGN_RCYC = '1100'.
但是,我获取所有记录而不是获取每个 TEST_ID 的最新记录(基于执行日期和执行时间),我不明白为什么...
你能帮帮我吗?
此处使用RANK
:
WITH cte AS (
SELECT *, RANK() OVER (PARTITION BY RN_TEST_ID
ORDER BY RN_EXECUTION_DATE DESC, RN_EXECUTION_TIME DESC) rnk
FROM yourTable
)
SELECT RN_TEST_ID, RN_RUN_ID, RN_EXECUTION_DATE, RN_EXECUTION_TIME, ST_STATUS
FROM cte
WHERE rnk = 1;
请注意,通常最好将日期和时间存储为单个 datetime/timestamp 列。您可能希望在某个时候更改您的设计。