首页 > 解决方案 > 根据一列中的值从查询中删除重复行

问题描述

我有一个表(SQL Server),我在其中存储了所有自动化测试用例的运行状态,并且我试图提出一个 SQL 查询来检索每个 runid 的状态,但是我遇到了一些问题.

表内数据示例:

KRUNID |      KTIME     |  FK_TC_ID  | NOPART | STATUS | ENV
-------+----------------+------------+--------+--------+-----
4180-2 | 20190109080000 |   TC0001   | 123456 | Passed | INT
4180-2 | 20190109080100 |   TC0002   | 123457 | Failed | INT
4180-2 | 20190109080200 |   TC0003   | 123458 | Passed | INT
4180-2 | 20190109080400 |   TC0002   | 123459 | Passed | INT

现在,我有这个查询(连接语句用于显示实际的测试用例名称和业务域):

SELECT KRUNID, TD_NAME, TS_NAME, FK_TC_ID, TC_DISPLAYNAME, NOPARTENAIRE,  
ENV, STATUS FROM RU_RUNSTATUS 
INNER JOIN TC_TESTCASES ON K_TC_ID = FK_TC_ID 
INNER JOIN TS_TCSUBDOMAINS ON K_TS_ID = FK_TS_ID 
INNER JOIN TD_TCDOMAINS on K_TD_ID = FK_TD_ID 
WHERE KRUNID = '418-2' 
ORDER BY FK_TS_ID, K_TC_ID

查询是基本的,它工作正常,除了当我只想根据 KTIME 获得最后一行时,我将有 2 行用于 TC0002(出于各种原因,我不想根据 STATUS 进行过滤)。

我还没有找到正确的方法来修改我的查询以获得我想要的结果。我怎样才能做到这一点?

谢谢

标签: sql-server

解决方案


我认为这篇文章可以回应:Get top 1 row of each group

查看您的查询,限制由 FK_TC_ID 分区并按 KTIME 排序

;WITH cte AS
(
SELECT FK_TS_ID, KRUNID, TD_NAME, TS_NAME, FK_TC_ID , TC_DISPLAYNAME, NOPARTENAIRE,  
ENV, STATUS, ROW_NUMBER() OVER (PARTITION BY FK_TC_ID  ORDER BY KTIME DESC) AS rn
FROM RU_RUNSTATUS 
INNER JOIN TC_TESTCASES ON K_TC_ID = FK_TC_ID 
INNER JOIN TS_TCSUBDOMAINS ON K_TS_ID = FK_TS_ID 
INNER JOIN TD_TCDOMAINS on K_TD_ID = FK_TD_ID 
WHERE KRUNID = '418-2' 
)
SELECT *
FROM cte
WHERE rn = 1
ORDER BY FK_TS_ID, K_TC_ID

推荐阅读