1

我有一个如下所示的表在此处输入图像描述

应该是唯一标识符的地方,drg,不是,所以我开始接受修复它的个人挑战。我可以通过多种方式轻松做到这一点,但我正在尝试以不同的方式做一些事情来学习一些新技术。需要从表中删除的是任何 drg唯一且 eff_date **小于 ** max 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
) 
4

3 回答 3

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 或更高版本)

于 2012-10-19T18:52:08.727 回答
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
    )
于 2012-10-19T18:43:49.787 回答
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

? 我意识到这可能有点骇人听闻,并且可能有更多雄辩的解决方案,但这应该可行。

于 2012-10-19T18:49:31.673 回答