如何仅选择其中一列是唯一的而另一列是特定值的行

时间:2019-07-10 18:29:40

标签: sql postgresql

我正在尝试找出哪些ID仅具有一种交易类型。

我尝试加入并选择“独特”,但我做错了

select transactions.type, id 
from datasource
group by id, transactions.type

这给了我一张具有两种交易类型的表:dep或withdraw。大多数ID具有两行,其中一行是dep,另一行是提取。我只想选择仅具有提款交易类型的ID

4 个答案:

答案 0 :(得分:0)

使用where条件和not exists

select transactions.type, id from datasource t1
where type='withdraw'
and not exists( select 1 from datasource t2 where t1.id=t2.id
               and type='dep')

答案 1 :(得分:0)

您可以在group by子句中使用having count(*)=1

select id 
  from datasource 
 where transactions_type in     
    (
     select transactions_type, id 
       from datasource
      group by transactions_type
     having count(*)=1 )

由于“您正在尝试找出哪些ID仅具有一种交易类型”

如果您专门寻找transactions_type = 'withdraw',请在上述Select语句的末尾添加and transactions_type = 'withdraw'

P.S。我想有一个transactions.type的类型,应该是transactions_type,不是吗?

答案 2 :(得分:0)

我认为聚合可以满足您的需求。但是,我很困惑您的数据结构是什么。在某处需要join

select ds.id, min(t.type)
from datasource ds join
     transactions t
     on ds.? = t.?   -- what is the join key?
group by ds.id
having min(t.type) = max(t.type);

如果transactions.type实际上是datasource中的一列,则:

select ds.id, min("transactions.type")
from datasource ds 
group by ds.id
having min("transactions.type") = max("transactions.type");

答案 3 :(得分:0)

类似于其他答案,但更简单:

select id, count(distinct transactions.type)
from datasource
group by id
having count(distinct transactions.type) = 1

目前还不清楚,transactions.type是什么。该列名似乎无效。还是要写transactions_type