3

列を持つテーブルがあるとしましょう:

CustomerNumber
Lastname
Firstname
PurchaseDate

...およびここに表示されていない場合、質問で何も変更しない他の列。

このテーブルには、同じ顧客に対して購入日が異なる多くの行が含まれている可能性があります (設計が不十分であることはわかっています... レポートの問題を修正しようとしているだけで、実際に問題の根本を修正しようとしているわけではありません)。

SQL で、顧客ごとに最新の日付のレコードを 1 つ保持し、残りを削除するにはどうすればよいですか? 私の場合、 Agroup byは機能していないようです

4

3 に答える 3

7
;with a as
(
select row_number() over (partition by CustomerNumber, Lastname, Firstname order by PurchaseDate desc) rn
from <table>
)
delete from a where rn > 1
于 2012-09-20T15:30:45.960 に答える
3

これは私にとってはうまくいきました(DB2上で):

 DELETE FROM my_table 
 WHERE (CustomerNumber, Lastname, Firstname, PurchaseDate) 
 NOT IN ( 
       SELECT CustomerNumber, Lastname, Firstname, MAX(PurchaseDate) 
       FROM my_table 
       GROUP BY CustomerNumber, Lastname, FirstName 
 )
于 2012-09-20T15:33:08.643 に答える
1
SELECT CustomerNumber, Lastname, Firstname, MAX(PurchaseDate) LatestPurchaseDate
FROM Table
GROUP BY CustomerNumber, Lastname, Firstname

MAX は最高 (最新) の日付を選択し、GROUP BY 列の一意の組み合わせごとにその日付を表示します。

編集: 最新の購入日以外のすべてのレコードを削除したいと誤解していました。

WITH Keep AS
(
    SELECT CustomerNumber, Lastname, Firstname, MAX(PurchaseDate) LatestPurchaseDate
    FROM Table
    GROUP BY CustomerNumber, Lastname, Firstname
)
DELETE FROM Table
WHERE NOT EXISTS
(
    SELECT *
    FROM Keep
    WHERE Table.CustomerNumber = Keep.CustomerNumber
    AND Table.Lastname = Keep.Lastname
    AND Table.Firstname = Keep.Firstname
    AND Table.PurchaseDate = Keep.LastPurchaseDate
)
于 2012-09-20T15:18:55.767 に答える