sql查询查找唯一记录

时间:2017-05-04 12:28:07

标签: 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-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

我正在尝试获取唯一的唯一记录,但重复记录也在进入

下面是应该出现在唯一组中的行。即,对于CDR_ID,TelephoneNo,Call_ID,call_Duration的相同组合,将存在多个call_Plans。我想读取CDR_ID,TelephoneNo,Call_ID,call_Duration,

的每个唯一组合只有一个呼叫计划的记录
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

请就此提出建议。

谢谢和问候

5 个答案:

答案 0 :(得分:1)

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

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 |
+--------+-------------+---------+---------------+-----------+---+

答案 1 :(得分:1)

使用not exists()

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
)

rextester演示:http://rextester.com/RRNNE20636

返回:

+--------+-------------+---------+---------------+-----------+-----+
| 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 |
+--------+-------------+---------+---------------+-----------+-----+

答案 2 :(得分:0)

基本上你应该试试这个:

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(*)OVER ...

进行更短的查询

答案 3 :(得分:0)


以下查询将为您提供结果

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;

它也为你提供了计数。如果不需要,您可以将其删除。

答案 4 :(得分:-3)

Select *, count(CDR_ID) 
from table
group by CDR_ID, TelephoneNo, Call_ID, call_Duration, Call_Plan
having count(CDR_ID) = 1