sql查询以查找唯一记录
我是sql新手,需要您的帮助来实现以下目标,我尝试过使用group和count函数,但我得到了唯一组中所有重复的行 下面是我的源数据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
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 |
+--------+-------------+---------+---------------+-----------+-----+