2017-06-10 7 views
0

特定の列のエントリが一意のSQLテーブルから行のみを返す方法はありますか?特定の列のエントリが一意のSQLテーブルから行のみを返します

例えば、

はのは、私はテーブルがあるとしましょう:

FRUIT COLOR 
_____________ 

apple green  
apple red  
peach blue 
banana red 

私はエントリFRUIT列内で一意である行のみを返すPostgreSQLのクエリを記述したいと思い、それはこの中でcaseは最後の2行を返すことを意味します。それ、どうやったら出来るの?ありがとう。特定の列のための

答えて

0

典型的なSQL構文は

SELECT * FROM (
    SELECT FRUIT, Count(FRUIT) AS NUM_OF_FRUITS FROM MyTable 
    GROUP BY City) 
WHERE NUM_OF_FRUITS = 1 

は桃やバナナを与えるということですが、あなたは、行全体を取るしたい場合は、私はそれがあると仮定し

SELECT * FROM MyTable 
WHERE FRUIT IN (
    SELECT * FROM (
     SELECT FRUIT, Count(FRUIT) AS NUM_OF_FRUITS FROM MyTable 
     GROUP BY City) 
    WHERE NUM_OF_FRUITS = 1 
) 

としてSQL構文の下に使用することができますあなたの質問に十分です。

+0

我々は 'で' COUNT(FRUIT)を持つことができない句サブクエリなし? – niceman

+0

@niceman 'HAVING'節に' COUNT(FRUIT) 'を入れることができます。 – Abelisto

+0

@Abelistoしかし、それは事実上、私たちが望むものを返すためにサブクエリを必要とする 'GROUP BY'を必要とするでしょう(OPが 'GROUP BY'の出力を受け入れない限り) – niceman

1

これは、having句を使用する際の初歩的な課題です。ドキュメント読む:Aggregate Functionsをし、これらのクエリを比較する:

select fruit, count(*) 
from my_table 
group by 1; 

fruit | count 
--------+------- 
banana |  1 
peach |  1 
apple |  2 
(3 rows) 


select fruit 
from my_table 
group by 1 
having count(*) = 1; 

fruit 
-------- 
banana 
peach 
(2 rows) 
+0

OPが全体の行を必要とする場合はどうすればよいですか? – niceman

+0

彼は集計を使用できます。 'max(color)'を選択します。 – klin

+0

私は多くの運がこの仕事をしているとは言えません。 – Thoth

1

あなたが全体の行を取得する必要がある場合は、

1)havingjoinを使用します。

select t.* 
from 
    my_table as t join (
    select fruit 
    from my_table 
    group by fruit 
    having count(*) = 1) as f on (t.fruit = f.fruit); 

2)窓関数を使用します。

select * 
from (
    select *, count(*) over (partition by fruit) as cnt 
    from my_table) as t 
where 
    cnt = 1; 
0

を使用した別のアプローチですWITH句とともに:

WITH f AS (
    SELECT fruit, color, count(fruit) OVER (PARTITION BY fruit) AS count 
    FROM fruits 
) 
SELECT f.* FROM f WHERE f.count = 1; 

fruit | color | count 
--------+-------+------- 
banana | red |  1 
peach | blue |  1 
(2 rows) 
関連する問題