删除除每个选定变量的 2 个最新参考期 (varchar) 行之外的所有行

Delete all but the 2 latest reference period (varchar) rows per selected variables

美好的一天,

首先,我做了一些研究并试图根据我的发现找到解决方案,但似乎没有任何效果:-(

所以我有以下 table:

CREATE TABLE Temp.tblKeepLastRefPeriod_MC
(
  SurveyCodeId            char(2) NULL,
  SurveyGroupCodeId       int NULL,
  ReferencePeriod         varchar(6) NULL,
  QuestionnaireTypeCodeId varchar(4) NULL
);

具有以下数据:

我想在每次执行程序时清理 table 以仅保留每个 SurveyCodeId、SurveyGroupCodeId 的 2 个最新 ReferencePeriod。输出应如下所示:

我在 select 部分尝试了以下方法,其中排名数字应按 SurveyCodeId、SurveyGroupCodeId、ReferencePeriod 分组...实际上我尝试了几个选项,但根本不起作用!!

SELECT *
FROM (
   SELECT *,
     ROW_NUMBER() OVER (PARTITION BY ReferencePeriod
     ORDER BY ReferencePeriod DESC) AS RankFromBack
   FROM Temp.tblKeepLastRefPeriod_MC
   WHERE SurveyCodeId = '09') 
   AS DataToBeDeleted
WHERE DataToBeDeleted.RankFromBack > 2;

WITH e AS (  SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY ReferencePeriod ORDER BY
       SurveyCodeId, SurveyGroupCodeId, ReferencePeriod DESC) AS Recency
      FROM [Temp].[tblKeepLastRefPeriod_MC]) 
SELECT * 
FROM e 
WHERE Recency = 2 

有人可以帮我解决这个问题吗?

非常感谢您的宝贵时间:-) 麦林

如果能理解什么是“根本不起作用”那就太好了!意思是,但我认为你想要的是 DENSE_RANK() 而不是 ROW_NUMBER():

;WITH x AS 
(
  SELECT
    SurveyCodeId, SurveyGroupCodeId, ReferencePeriod, QuestionnaireTypeCodeId,
    dr = DENSE_RANK() OVER (PARTITION BY SurveyCodeId, SurveyGroupCodeId 
                            ORDER BY ReferencePeriod DESC)
  FROM Temp.tblKeepLastRefPeriod_MC
)
DELETE x WHERE dr > 2;

(请使用 CREATE TABLE / INSERT 示例数据的形式,而不是屏幕截图。)