识别2行中的唯一值

时间:2014-12-17 18:53:11

标签: sql-server

可以为1个帐号分配多个帐户名。由于数据库中有一百万行,我想知道如何查询仅分配给一个帐户的帐户#。请参阅以下示例数据:

帐号#100,100,500,650,250,250,600,400,400
帐户名称ABA,DSA,ABA,DSA,ABA,DSA,DSA,ABA,ABA

查询结果应为#500,650,400帐户,因为这些帐户#只分配了一个帐户名称。

帐户100和250分配了多个帐户名。如何仅分配1个帐户名来过滤帐号?请帮忙

3 个答案:

答案 0 :(得分:0)

GROUP BYHAVING是上述评论中所述的方法。

select account_num
from your_table
group by account_num
having COUNT(*) = 1

有些人会对COUNT()中的*表示不满,但如果这是一个临时的非生产查询,我认为这在性能方面并不重要。

答案 1 :(得分:0)

基于这个问题,我相信查询应该返回400,500,600,650。

使用having count(*) =1子句的查询将不会根据问题中给出的数据返回400。

create table #Accounts (
  AccountNumber int not null
  , AccountName char(3) not null
  )

insert into #Accounts (AccountNumber,AccountName) values
  (100,'ABA')
 ,(100,'DSA')
 ,(500,'ABA')
 ,(650,'DSA')
 ,(250,'ABA')
 ,(250,'DSA')
 ,(600,'DSA')
 ,(400,'ABA')
 ,(400,'ABA');

with cte as (
select AccountNumber
     , AccountName 
     , RowNumber= row_number() over (
        partition by AccountNumber 
        order by AccountName
        )
  from #Accounts 
  group by AccountNumber, AccountName
)
  select AccountNumber
       , AccountName 
    from cte
    where not exists (
      select 1 
        from cte as i 
        where i.AccountNumber = cte.AccountNumber 
          and i.RowNumber = 2
          );

答案 2 :(得分:0)

这将返回帐号no和名称,其中帐号no链接到多个名称 注意:在您的示例数据中,帐户号400两次链接到同一个名称... 我不确定它是否应该算作与1个名字相关联......

这将包括AccountNo 400

SELECT DISTINCT AccountNo, AccountName
FROM #Accounts a
WHERE (
SELECT COUNT(DISTINCT AccountName)
FROM #Accounts b
WHERE a.AccountNo = b.AccountNo) = 1

这不包括400号帐户(子查询中没有DISTINCT)

SELECT DISTINCT AccountNo, AccountName
FROM #Accounts a
WHERE (
SELECT COUNT(AccountName)
FROM #Accounts b
WHERE a.AccountNo = b.AccountNo) = 1