使用HAVING子句SQL Server 2008中的聚合从语句中删除

时间:2012-10-19 18:33:42

标签: sql sql-server sql-delete

我有一个类似于以下enter image description here

的表格 什么应该是唯一标识符,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
) 

3 个答案:

答案 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

?我意识到这可能有点黑客攻击,可能会有更多有说服力的解决方案,但这应该有用。