首先,我怀疑结果它不准确?好像从原来的桌子上有三个'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