仅在有超过1个实例的情况下查找记录

时间:2017-05-24 17:08:37

标签: sql sql-server-2012

我有一张大概有700k记录的表。桌子的结构看起来像这样......

ID     Type       ValueA
553    1          DCM
553    2          DCMM
586    1          ADM
587    1          HDD
587    2          HDS

基本上我可以在ID中有多个值,例如示例中显示的553和587。在Type中,每个后续记录的类型增加1。因此,553以Type = 1开始,然后是2.然而,有些记录有十几种类型。我试图找出是否有一种方法可以查询此表只显示ID的数据,其中有多于1个类型

期望的结果:

ID     Type       ValueA
553    1          DCM
553    2          DCMM
587    1          HDD
587    2          HDS

我应该只获得这些记录,因为553有2个实例,587也是如此。586不会被包括在内,因为它只有一个记录。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:4)

如果type是连续的并且按照您的建议以1开头,则您可以像exists()那样使用:

select *
from t
where exists (
  select 1
  from t i
  where i.id = t.id 
    and i.type > 1
)

否则,您可以加入使用聚合的派生表,并having()查找具有多行的id,如下所示:

select t.*
from t
  inner join (
    select Id
    from t
    group by Id
    having count(*) > 1
  ) as dup
  on t.id = dup.id

rextester演示(适用于两者):http://rextester.com/IZUIAL81840

返回(两者):

+-----+------+--------+
| Id  | Type | ValueA |
+-----+------+--------+
| 553 |    1 | dcm    |
| 553 |    2 | dcmm   |
| 587 |    1 | hdd    |
| 587 |    2 | hds    |
+-----+------+--------+

答案 1 :(得分:0)

我认为这就是你正在寻找的东西

>> list
list = 
    'car'    'glasses'    'glasses'    'apple'    'apple'
>> [unique_strings, ~, string_map] = unique(list,'stable');
>> unique_strings(mode(string_map))
ans = 
    'glasses'

答案 2 :(得分:0)

试试这个:)

#include <iostream>
#include <time.h>
void wait(int ms){

    clock_t begin = clock(), end;
    double t;

    while(true){
        end = clock();
        t=double(end - begin) / CLOCKS_PER_SEC;
        if(t>=(double) ms/1000)
            break;
    }

    return;

}

void display_dramatically(std::string x) {
    for(int i=0;i<x.size();++i) {
        std::cout<<x[i]<<"\n";
        wait(100);
    }   
}

答案 3 :(得分:0)

使用子查询的另一个选项:

select * from t where id in (
 select distinct ID 
 from t
 group by id
 having count(*) > 1
)

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