sql查询以查找唯一记录

sql查询以查找唯一记录,sql,sql-server,Sql,Sql Server,我是sql新手,需要您的帮助来实现以下目标,我尝试过使用group和count函数,但我得到了唯一组中所有重复的行 下面是我的源数据 CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan 543,xxx-23,12,12,500 543,xxx-23,12,12,501 543,xxx-23,12,12,510 643,xxx-33,11,17,700 343,xxx-33,11,17,700 766,xxx-74,32,1,300 766,xxx

我是sql新手,需要您的帮助来实现以下目标,我尝试过使用group和count函数,但我得到了唯一组中所有重复的行

下面是我的源数据

CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan
543,xxx-23,12,12,500
543,xxx-23,12,12,501
543,xxx-23,12,12,510
643,xxx-33,11,17,700
343,xxx-33,11,17,700
766,xxx-74,32,1,300
766,xxx-74,32,1,300
877,xxx-32,12,2,300
877,xxx-32,12,2,300
877,xxx-32,12,2,301
请注意:-源具有多个唯一记录组合,因此当我进行计数时,唯一集不会显示为count=1

示例:-源中的以下数据对于每个组合有60条记录

877,xxx-32,12,2,300 -- 60 records
877,xxx-32,12,2,301 -- 60 records
我试图得到唯一的记录,但重复的记录也得到了

下面是应在唯一组中出现的行。i、 e.对于CDR\u ID、电话号码、呼叫ID、呼叫持续时间的相同组合,将有多个呼叫计划。我想读取只有一个呼叫计划用于CDR\u ID、电话号码、呼叫ID、呼叫持续时间的每个唯一组合的记录

CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan
643,xxx-33,11,17,700
343,xxx-33,11,17,700
766,xxx-74,32,1,300
请对此提出建议


感谢并问候

基本上你应该试试这个:

Select *, count(CDR_ID) 
from table
group by CDR_ID, TelephoneNo, Call_ID, call_Duration, Call_Plan
having count(CDR_ID) = 1
SELECT A.CDR_ID, A.TelephoneNo, A.Call_ID, A.call_Duration, A.Call_Plan
FROM YOUR_TABLE A
INNER JOIN (SELECT CDR_ID,TelephoneNo,Call_ID,call_Duration
            FROM YOUR_TABLE
            GROUP BY CDR_ID,TelephoneNo,Call_ID,call_Duration
            HAVING COUNT(*)=1
            ) B ON A.CDR_ID= B.CDR_ID AND A.TelephoneNo=B.TelephoneNo AND A.Call_ID=B.Call_ID AND A.call_Duration=B.call_Duration

您可以使用Windows函数COUNT(*)在…


上执行较短的查询。下面的查询将为您提供结果

SELECT CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan, COUNT(*)
FROM TABLE_NAME GROUP BY CDR_ID,TelephoneNo,Call_ID,call_Duration,Call_Plan
HAVING COUNT(*) < 2;
选择CDR\u ID、电话号码、呼叫ID、呼叫持续时间、呼叫计划、计数(*)
根据CDR\u ID、电话号码、呼叫ID、呼叫持续时间、呼叫计划从表\u名称组中选择
计数(*)小于2;

它也给了你一个数字。如果不需要,您可以将其删除。

要进行更复杂的分组,您还可以使用通用表表达式/派生表以及窗口函数:

declare @t table(CDR_ID int,TelephoneNo nvarchar(20),Call_ID int,call_Duration int,Call_Plan int);
insert into @t values (543,'xxx-23',12,12,500),(543,'xxx-23',12,12,501),(543,'xxx-23',12,12,510),(643,'xxx-33',11,17,700),(343,'xxx-33',11,17,700),(766,'xxx-74',32,1,300),(766,'xxx-74',32,1,300),(877,'xxx-32',12,2,300),(877,'xxx-32',12,2,300),(877,'xxx-32',12,2,301);

with cte as
(
select CDR_ID
    ,TelephoneNo
    ,Call_ID
    ,call_Duration
    ,Call_Plan
    ,count(*) over (partition by CDR_ID,TelephoneNo,Call_ID,call_Duration) as c
from (select distinct * from @t) a
)
select *
from cte
where c = 1;
输出:

+--------+-------------+---------+---------------+-----------+---+
| CDR_ID | TelephoneNo | Call_ID | call_Duration | Call_Plan | c |
+--------+-------------+---------+---------------+-----------+---+
|    343 | xxx-33      |      11 |            17 |       700 | 1 |
|    643 | xxx-33      |      11 |            17 |       700 | 1 |
|    766 | xxx-74      |      32 |             1 |       300 | 1 |
+--------+-------------+---------+---------------+-----------+---+
使用
不存在()


您还可以分享您迄今为止尝试过的代码吗?为了给您一个提示,请尝试SQLHave changed中的
COUNT
函数,而不是小于,大于由错误提供在问题中有两行,其中
cdr_id=766
,但代码中只有这两行中的一行。@SqlZim这就是我在进行多次编辑之前回答问题得到的结果……没错,我应该检查编辑历史记录。rextester演示用于更新答案
select distinct * 
from t
where not exists (
  select 1
  from t as i
  where i.cdr_id = t.cdr_id
    and i.telephoneno = t.telephoneno
    and i.call_id = t.call_id
    and i.call_duration = t.call_duration
    and i.call_plan <> t.call_plan
)
+--------+-------------+---------+---------------+-----------+-----+
| cdr_id | TelephoneNo | Call_id | call_Duration | Call_Plan | cnt |
+--------+-------------+---------+---------------+-----------+-----+
|    343 | xxx-33      |      11 |            17 |       700 |   1 |
|    643 | xxx-33      |      11 |            17 |       700 |   1 |
|    766 | xxx-74      |      32 |             1 |       300 |   1 |
+--------+-------------+---------+---------------+-----------+-----+