SQL - 在多行中查找重复字段的方法?

时间:2016-07-18 15:45:37

标签: sql sql-server count duplicates

我想知道是否有办法返回部分行的副本。

IDTable设置:

ID# | Customer  | EventID#
1   | Steve     | 123
2   | Steve     | 123
3   | John      | 987
4   | John      | 924

由于史蒂夫和123一起出现两次,我想把它视为一个重复的'即使他们有两个不同的ID#。如果有重复',理想情况下,我只想返回列:ID#,Customer&事件ID#。因此,对于上面的IDTable示例,只返回:

1   | Steve | 123
2   | Steve | 123

通过运行以下命令,它会分别计算每个ID + Customer + EventID#并将所有Count值返回为1(我使用SQL Server 2008):

SELECT ID#, Customer, EventID#, COUNT({fn CONCAT(Customer,EventID#)})
FROM IDTable
GROUP BY ID#, Customer, EventID#
HAVING COUNT({fn CONCAT(Customer,EventID#)}) > 1

如果我从选择中取出ID#,它会工作但我们不知道ID是什么。

编辑: 我正在加入其他表中的选择列。为了简单起见,我最初将这些问题留在了下面,当我尝试应用以下解决方案时,我感到困惑。道歉!这与我使用的内容更为一致:

SELECT A.ID#, C.Customer, E.EventID#
FROM IDTable A
INNER JOIN CustomerTable C
   ON C.AccountID = A.AccountID
INNER JOIN EventTable E
   ON E.AccountType = C.AccountType
WHERE C.StatusID = 'Active'

4 个答案:

答案 0 :(得分:1)

自我加入应该做的伎俩:

scontrino

编辑您的联接:

您仍然可以使用自联接,只需使用派生表,如下所示:

SELECT     A.ID#, A.Customer, A.EventID#
FROM       Table A
INNER JOIN Table A2 ON A.Customer = A2.Customer 
                   AND A.EventID# = A2.EventID# 
                   AND A.ID# <> A2.ID#

使用SELECT A.ID#, A.Customer, A.EventID# FROM (SELECT ID#, Customer, EventID# FROM IDTable A INNER JOIN CustomerTable C ON C.AccountID = A.AccountID INNER JOIN EventTable E ON E.AccountType = C.AccountType WHERE C.StatusID = 'Active') A INNER JOIN (SELECT ID#, Customer, EventID# FROM IDTable A INNER JOIN CustomerTable C ON C.AccountID = A.AccountID INNER JOIN EventTable E ON E.AccountType = C.AccountType WHERE C.StatusID = 'Active') A2 ON A.Customer = A2.Customer AND A.EventID# = A2.EventID# AND A.ID# <> A2.ID# 更清洁:

#TEMP

答案 1 :(得分:1)

大多数版本的SQL支持窗口函数。解决这个问题最简单的方法是:

select id, customer, eventid#
from (select i.*, count(*) over (partition by customer, eventid#) as cnt
      from idtable i
     ) i
where cnt > 1;

答案 2 :(得分:0)

SELECT i.*
FROM
    IDTable i
    INNER JOIN 
       (SELECT Customer, EventID#
       FROM IDTable
       GROUP BY ID#, Customer, EventID#
       HAVING COUNT(*) > 1) t
    ON i.Customer = t.Customer
    AND i.EventId# = t.EventId#

可能还有其他方法可以做到这一点,如果你标记你的特定rdbms(sql-server,oracle,mysql等),我相信你会得到更多的答案,但这是一种方法,这是使用你的查询(没有ID列)来识别重复项,然后通过内部联接将其匹配回原始表。

答案 3 :(得分:0)

从@ Aaron_D的答案我不加入子查询,而是你可以这样做:

SELECT A.ID#, C.Customer, E.EventID#
FROM IDTable A
INNER JOIN IDTable B ON A.ID# = B.ID#
                    AND A.AccountID <> B.AccountID
INNER JOIN CustomerTable C
   ON C.AccountID = A.AccountID
INNER JOIN EventTable E
   ON E.AccountType = C.AccountType
WHERE C.StatusID = 'Active'

由于CustomerTable和EventTable都是最后一个派生自AccountID的实例,因此它可以正常工作并且速度更快。