2017-12-06 10 views
0
select starttime, (select count(trackid) c2 from playlistitem p1 where 
p2.radiobroadcastid = p1.radiobroadcastid) from radiobroadcast p2 

OUTPUT:PostgreSQLどのようにサブクエリの出力でWHEREを使用するのですか?

Starttime    c2 
2011-10-14 20:00:00.0 42 
2011-10-20 20:00:00.0 43 
2011-10-07 09:00:00.0 7 

私は(ここでは43のthats)のC2列のMAX私を示したいと思います。 c2が列として定義されていない場合、どうすればよいですか?

編集:おそらく、HAVINGにカウントにブール値としてのみ表示さMAX値にとにかく

select starttime, count(trackid) from radiobroadcast inner join playlistitem 
using(radiobroadcastid) GROUP by starttime HAVING count(*) > 100 

BY HAVINGおよびGROUPを使用する必要がありますか?

答えて

0

あなたは、サブクエリの結果に別名を与える必要があり、その後、あなたはその別名で注文し、制限を適用することができます。

select starttime, 
     (select count(trackid) 
     from playlistitem p1 
     where p2.radiobroadcastid = p1.radiobroadcastid) as c2 
from radiobroadcast p2 
order by c2 desc 
limit 1; 

(注)同じ数を持つ2つの行を持っている場合に、あなたはこのアプローチを使用しているものだけが表示されます。

は、JOINステートメントを使用して最高値を見つけるには、同じアプローチを使用します。あなたがそれらのすべてを見るために、複数の最高数と何を考えなければならない場合

select starttime, 
     count(trackid) as cnt 
from radiobroadcast 
    join playlistitem using(radiobroadcastid) 
GROUP by starttime 
order by cnt desc 
limit 1; 

を、あなたが取得するウィンドウ関数を使用することができますしかし、最高のカウント、エイリアスを使用するために、派生テーブルでクエリをラップする必要があります。

select starttime, cnt 
from (
    select starttime, 
      count(trackid) as cnt, 
      max(count(trackid)) over() as max_cnt 
    from radiobroadcast 
     join playlistitem using(radiobroadcastid) 
    GROUP by starttime 
) t 
where cnt = max_cnt; 

あなただけの単一の行が必要な場合は、LIMITアプローチは、窓関数を使用して1その後、典型的に高速であります。

+0

エイリアスであっても、WHEREを使用すると、'org.postgresql.util.PSQLException:ERROR:column "c2" does not exist "と表示されます。 (作品別注文) –

+0

@RobVanMeirvenne:正しいですが、order by句でのみそのようなエイリアスを使用できます。しかし、 'order by 'と' limit'では、where句は必要ありません。 –

+0

**ラジオ放送からのstarttime、count(trackid)の選択インナー・ジョイントplaylistitem(radiobroadcastid)GROUP by starttime HAVING count(*)> 100 **このコードでは、100より大きいすべての開始時間が表示されるようになりました。私のクラスはこれについて非常に悪い説明をしました。 –

関連する問題