我有一个类似于以下
的表格 什么应该是唯一标识符,drg,不是,所以我开始修复它的个人挑战。我可以通过各种方式轻松完成这项工作,但我正在尝试以不同的方式做一些事情以学习一些新技术。需要从表中删除的是任何一行,其drg 不唯一且其eff_date小于**最大eff_date。找到我需要的东西
select d1.drg, MAX(d1.eff_date) as maxEffDate,d2.drgdesc
from drgtable d1
inner join drgtable d2 on d1.drg=d2.drg
group by d1.drg,d2.drgdesc
having MAX(d1.eff_date) = MAX(d2.eff_date)
我想在删除语句中执行此操作,而不是仅将其选择到新表中并删除旧表。
我在下面这个看起来很奇怪的查询的过程就是从我上面使用的查询中找到不在表中的行并删除它们。我走近了,但被卡住了。此外,如果有更简单的方法,请告诉我。感谢
- 这样做的目的是找到d3中不在d4中的行并删除它们。并没有那么远
delete from
drgtable
where
(
select * from drgtable as d3
left join
(
select d1.drg, MAX(d1.eff_date) as maxEffDate,d2.drgdesc
from drgtable d1
inner join drgtable d2 on d1.drg=d2.drg
group by d1.drg,d2.drgdesc
having MAX(d1.eff_date) = MAX(d2.eff_date)
) d4 on d4.drg =d3.drg and d4.maxEffDate = d3.eff_date and d3.drgdesc = d4.drgdesc
)
答案 0 :(得分:4)
这应该有效:
;WITH cte As
(
SELECT *,
MAX(eff_date) OVER(partition by drg) as MaxEffDate
FROM drgtable
)
DELETE
FROM cte
WHERE eff_date <> MaxEffDate
另外,还有很多新的技巧供你学习。 : - )
(注意:这确实假设您使用的是SQL Server 2005或更高版本)
答案 1 :(得分:2)
如果我理解你的正确,那么你需要这样吗?
delete drgtable
from drgtable as d1
where exists
(
select t.*
from drgtable as t where t.drg = d1.drg and t.eff_date > d1.eff_date
)
答案 2 :(得分:0)
你可以尝试一下:
delete from drgtable
where DRG+MaxEffDate
not in
(Select drg+maxEffDate as Combo
FROM
(select d1.drg,
MAX(d1.eff_date) as maxEffDate,
d2.drgdesc
from drgtable d1
inner join drgtable d2
on d1.drg=d2.drg
group by d1.drg,d2.drgdesc
having MAX(d1.eff_date) = MAX(d2.eff_date) ) as RecordsToKeep
)
-- assuming there are no nulls in the data
?我意识到这可能有点黑客攻击,可能会有更多有说服力的解决方案,但这应该有用。