首先,我懷疑結果它不準確?好像從原來的桌子上有三個'Sam'。但這個問題並不重要。
然後,我們來了這個問題本身。根據您的表格,顯示重複值的最佳方式是使用count(*)
和Group by
子句。查詢應該是這樣的
SELECT OrderNo, shoppername, amountPayed, city, item, count(*) as RepeatTimes FROM dbo.sales GROUP BY OrderNo, shoppername, amountPayed, city, item HAVING COUNT(*) > 1
的原因是,從表中唯一標識每個記錄,所有列在一起,這意味着該記錄將被視爲重複的,只有當從每列的所有值都完全相同,還想顯示重複記錄的所有字段,因此group by
不會錯過任何列,否則是,因爲您只能參與'group by'子句的select
列。
現在我想給你任何With...Row_Number()Over(...)
的例子,它使用表格式和Row_Number函數一起使用。
假設您有一個幾乎相同的表格,但有一個額外的列名爲發運日期,並且即使其餘值相同,值可能會更改。那就是:
OrderNo shoppername amountpayed city Item Shipping Date
1 Sam 10 A Iphone 2016-01-01 1 Sam 10 A Iphone 2016-02-02 1 Sam 5 A Ipod 2016-03-03 2 John 20 B Macbook 2016-04-04 3 John 25 B Macbookair 2016-05-05 4 Jack 5 A Ipod 2016-06-06
注意,列#2是不是如果你仍然需要所有列的單元重複一個。但是如果你想在這種情況下把它們看作是重複的呢?您應該使用With...Row_Number()Over(...)
,並查詢應該是這樣的:
WITH TABLEEXPRESSION AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier) --if you consider the one with late shipping date as the duplicate FROM dbo.sales) SELECT * FROM TABLEEXPRESSION WHERE Identifier !=1 --or use '>1'
上面的查詢將共同給予的結果與出貨日期,例如:
OrderNo shoppername amountpayed city Item Shipping Date Identifier 1 Sam 10 A Iphone 2016-02-02 2
注意這個人是不同的從2016-01-01開始,並且2016-02-02已過濾的原因是PARTITION BY OrderNo, shoppername, amountPayed, city, item ORDER BY [Shipping Date] as Identifier
,並且裝運日期不是需要處理重複記錄的列之一,這意味着與2016-02-02仍然可能是一個完美的結果爲您的問題。
現在總結一下吧點點,使用count(*)
和Group by
條款在一起是最好的選擇,當你只想從Group by
條款作爲結果顯示所有列,否則你會錯過那些不參加group by
列。
雖然對於With...Row_Number()Over(...)
,它適用於所有需要查找重複記錄的場景,但是,與前者相比,編寫查詢和設計過程稍微複雜一點。
如果您的目的是從表中刪除重複記錄,則必須使用後面的WITH...ROW_NUMBER()OVER(...)...DELETE FROM...WHERE
之一。
希望這會有所幫助!
我有50場。所以沒有辦法,如果沒有單獨寫出所有字段的名字,我可以找出重複的記錄! – Matthew 2012-03-24 09:17:17
右鍵單擊表格,選擇:腳本表格>>選擇>>新建查詢編輯器窗口。現在你已經有了你的SELECT列表,複製並粘貼到你的GROUP BY部分。 – JerryOL 2012-03-26 02:14:43