2013-05-11 32 views
1

NEWBIE ALERTSQL - 试图排除重复数据删除同居

我有一个基于家庭SQL Server 2005的表含客户的账户,所以每家每户都有一个CustomerCode,像这样:

CUSTOMERCODE UNIQUEID TITLE FORENAME SURNAME ADDRESS1 
A3210   034123 Mr  Bill  Whithers 1 Roach Street 
A3210   300443 Mrs Jane  Whithers 1 Roach Street 
A5342   450034 Mr  Jeff  Babbage 23 Ruben Road 
A6786   258032 Mr  Aubrey Truss  54 Bilge Terrace 

在尝试重复此表时,我们不希望包含来自同一家庭的任何客户。我可以找到愚蠢的&,所以我认为我可以包围另一个查询,以排除任何具有相同的CustomerCode,其中标题不匹配(我意识到这不是一个水密方法)的行。但对于我的生活,我无法获得任何工作。

有什么想法吗?请。毫无疑问,这很简单&我很浪费你的时间,但如前所述,我是一个新手...

在此先感谢。

+0

你想排除有2个或更多居民的所有家庭,或者你想只计算一次吗? – jle 2013-05-11 17:10:30

+0

是的排除他们所有,因为他们不是真正重复,只是共同居住。非常感谢!我意识到桌子的设计不是很好,但我们坚持这一点,因为它必须解决它。 – Ade 2013-05-11 17:15:28

回答

0

您可以使用row_number()为居住在同一地址的人分配越来越多的号码。

select * 
from (
     select row_number() over (
        partition by Address1 
        order by UniqueID) as rn 
     ,  * 
     from YourTable 
     ) SubQueryAlias 
where rn = 1 -- Select only first person at an address 
+0

好主意Andomar - 我正在使用Over Partition在第一个查询中查找模糊。但我需要进一步排除的原因是,该地址可能存在任何客户的重复记录。因此,如果他们有相同的地址,但标题不同,则可以排除这种粗略的想法。但是,当然,如果一对夫妇有一个也是客户的儿子,即两个实际上有效的独立客户的'先生',那么这也不是完美的。 – Ade 2013-05-11 17:23:38

+0

我的初始查询吐出受骗者: 'SELECT *,ROW_NUMBER()过(分区通过CustomerCode,分公司顺序按UniqueID的DESC)RowId的从CustomersTable' “分公司”是他们参观了车间的只是代码 - 这不是每个客户或家庭所特有的。 – Ade 2013-05-11 17:30:48

1

如果你想每户家庭只有一排,然后用row_number()

select c.* 
from (select c.*, 
      row_number() over (partition by CustomerCode order by UniqueId) as seqnum 
     from Customers c 
    ) c 
where seqnum = 1; 

如果你想只有一个成员的家庭,然后使用count() over

select c.* 
from (select c.*, 
      count(*) over (partition by CustomerCode) as HouseholdCnt 
     from Customers c 
    ) c 
where HouseholdCnt = 1; 

这些都是“窗口”函数的例子,这对于了解你是否正在学习SQL非常有用。

+0

非常感谢戈登 - 后者可能让我更接近我想要的。但是,暂时忽略这个问题,我会如何去排除所有不属于同一家庭的所有客户,而这些客户没有相同的标题?理论上看起来很容易,但我不能把它放到SQL中。 – Ade 2013-05-11 17:37:35