我有一张大概有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不会被包括在内,因为它只有一个记录。
任何帮助都将不胜感激。
答案 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
)