2

各商品の価格を毎日保存する「監査ログ」テーブルがあります。サンプルデータは次のとおりです。

1 - Item 587 - $19.99 - 12/1/2012
2 - Item 587 - $19.99 - 12/2/2012
3 - Item 587 - $18.99 - 12/3/2012
4 - Item 587 - $18.99 - 12/4/2012
5 - Item 587 - $20.99 - 12/5/2012
6 - Item 587 - $19.99 - 12/6/2012
7 - Item 587 - $19.99 - 12/7/2012
8 - Item 587 - $17.99 - 12/8/2012
9 - Item 587 - $17.99 - 12/9/2012
10 - Item 587 - $17.99 - 12/10/2012

これは正常に機能しますが、このテーブルは急速に拡大しています。ここで、重複行を削除する T-SQL スクリプトが必要です。スクリプト後のデータセットは次のようになります。

1 - Item 587 - $19.99 - 12/1/2012
3 - Item 587 - $18.99 - 12/3/2012
5 - Item 587 - $20.99 - 12/5/2012
6 - Item 587 - $19.99 - 12/6/2012
8 - Item 587 - $17.99 - 12/8/2012

GROUP BYorDISTINCTが求められているようですが、どのように開始すればよいかわかりません。

4

3 に答える 3

3
WITH DuplicateTableWithDupNumbers
as
(
    SELECT recid, itemid, price, date, 
        ROW_NUMBER() OVER (PARTITION BY itemid ORDER BY  dateDESC ) AS DupNumber
    FROM YourTable
)
delete from YourTable
where EXISTS
(
    SELECT 1 
    from DuplicateTableWithDupNumbers as dup 
    WHERE DupNumber > 1 AND dup.recid = yourtable.recid
)

必要に応じてパーティション設定を変更できます。これにより、1 つのクエリでテーブルから直接削除されます。

于 2012-12-07T21:03:52.517 に答える
0

同一値のチェックに再帰的СTEを使用する

;WITH cte AS
 (
  SELECT Id, ItemId, Price, [date], 
         0 AS ChPrice
  FROM dbo.audit_log
  WHERE Id = 1
  UNION ALL
  SELECT a.Id, a.ItemId, a.Price, a.[date],
         CASE WHEN a.Price = c.Price THEN a.Id ELSE 0 END
  FROM dbo.audit_log a JOIN cte c ON a.Id = c.Id + 1  
  )
DELETE a
FROM dbo.audit_log a JOIN cte c ON a.Id = c.ChPrice

SQLFiddle のデモ

于 2012-12-10T00:02:17.320 に答える
0

これらの値がテーブルにあると仮定すると、次のようなものが必要になります。

select id, t.item, t.price, date 
from table t inner join
(select item, price, min(date) as min_date
from table
group by item, price) g on 
t.item = g.item and
t.price = g.price
t.date = g.min_date
于 2012-12-07T21:02:25.527 に答える