簡體   English   中英

刪除重復項-SQL Server 2000-2005

[英]Remove duplicates - SQL server 2000-2005

僅適用於通過SQL查詢的MSSQL 2000-2005,無存儲過程

沒有游標和臨時表

桌子

create table my_table
(
row_id int identity(1,1),
_key varchar(20),
_total decimal(18,2)
)

插入數據

insert into my_table (_key,_total) Values('qwe',10)
insert into my_table(_key,_total) Values ('qwe',10)
insert into my_table(_key,_total) Values ('asd',10)
insert into my_table(_key,_total) Values('asd',10)
insert into my_table(_key,_total) Values('zxc',10)
insert into my_table(_key,_total) Values('zxc',10)
insert into my_table(_key,_total) Values('qwe',100)
insert into my_table(_key,_total) Values('qwe',100)
insert into my_table(_key,_total) Values('asd',100)
insert into my_table(_key,_total) Values('asd',100)
insert into my_table(_key,_total) Values('zxc',100)
insert into my_table(_key,_total) Values('zxc',100)
insert into my_table(_key,_total) Values('qwe',50)
insert into my_table(_key,_total) Values('qwe',50)
insert into my_table(_key,_total) Values('asd',50)
insert into my_table(_key,_total) Values('asd',50)
insert into my_table(_key,_total) Values('zxc',50)
insert into my_table(_key,_total) Values('zxc',50)

我需要通過_key字段刪除重復項,並保留最大_total的行,其中最大的row_id。

我需要得到這個結果集

8 qwe 100.00
10 asd 100.00
12 zxc 100.00

要刪除它們,這就是我認為“刪除重復項”的意思:

DELETE FROM dbo.my_table
 WHERE NOT EXISTS(SELECT NULL                       
                    FROM dbo.my_table x
                    JOIN (SELECT _key,
                                  MAX(_total) AS max_total
                             FROM dbo.my_table
                         GROUP BY _key) y ON y._key = x._key
                                         AND y.max_total = x._total 
                   WHERE x._key = my_table._key
                     AND x._total = my_table._total
                GROUP BY x._key, x._total
                  HAVING MAX(x.row_id) = my_table.row_id)

選擇您要列出的行的查詢是:

  SELECT MAX(x.row_id),
         x._key,
         x._total
    FROM dbo.my_table x
    JOIN (SELECT _key,
                 MAX(_total) AS max_total
            FROM dbo.my_table
        GROUP BY _key) y ON y._key = x._key
                      AND y.max_total = x._total 
GROUP BY x._key, x._total

如果您首先用通俗易懂的語言表達您想要的內容,那將變得更加容易

  • 找到每個的最大row_id(每個鍵的最大總數)

...變成...

  • 找到每個鍵的最大總數
  • 加入並找到每個(key,max(total))組合的最大row_id

我還沒有運行...我將其留給您查找任何缺少的逗號等

SELECT
    MAX(row_id) AS MaxRowid, M._key, M._total
FROM
    (
    SELECT 
        _key, max(_total) AS TTotal
    FROM
        my_table
    GROUP BY
        _key
    ) foo
    JOIN
    my_table M ON foo._key = M._key AND foo.TTotal = M._total
GROUP BY
    M._key, M._total

對於SQL Server 2005+,我可以使用CTE進行更改

;WITH cFoo AS
(
   SELECT
      row_id, _key, _total, 
      ROW_NUMBER() OVER (PARTITION BY _key ORDER BY _total DESC, row_id DESC) AS bar
)
SELECT
    row_id, _key, _total
FROM
    cFoo
WHERE
    bar = 1

您可以通過使用兩個查詢來實現:

--Delete all lesser total duplicates
delete T1
from My_Table T1, My_Table T2
where T1._key = T2._key
and T1._total < T2._total

--Delete all equal total with lesser row_id duplicates
delete T1
from My_Table T1, My_Table T2
where T1._key = T2._key
and T1.row_id < T2.row_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM