删除除每个选定变量的 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 示例数据的形式,而不是屏幕截图。)
美好的一天,
首先,我做了一些研究并试图根据我的发现找到解决方案,但似乎没有任何效果:-(
所以我有以下 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 示例数据的形式,而不是屏幕截图。)