1

次のようなテーブルがありますここに画像の説明を入力してください

一意の識別子であるdrgはそうではないので、私はそれを修正するという個人的な挑戦から始めました。私はこれを無数の方法で簡単に行うことができましたが、私はいくつかの新しい技術を学ぶために別の方法でいくつかのことをしようとしています。テーブルから削除する必要があるのは、drgが一意ではなく、eff_dateが**maxeff_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)

これを新しいテーブルに選択して古いテーブルを削除するのではなく、deleteステートメントで実行したいと思います。

以下の奇妙なクエリでの私のしかしプロセスは、私が使用した上記のクエリからテーブルになかった行を見つけて削除することでした。近づいたが行き詰まっている。また、これを行う簡単な方法がある場合は、お知らせください。ありがとう

--これの目的は、d4になかったd3の行を見つけて、それらを削除することでした。それほど遠くまでは行きませんでした

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 に答える