2017-02-16 27 views
1

いくつかのグループで最大値を持つ行のデータを返すSQLクエリを作成したいと思います。デモの次の例を考えてみましょう。Postgresql - 列の最大値を持つ行を取得する

国、出版社、書籍の3つのテーブルがあります。各出版社は1つの国に属し、各書籍には1つの出版社があります。定義は、各行がその国の中で最も最近リリースされた本の名前が含まれるように、私は、国ごとにグループ化され(COUNTRY_ID、BOOK_NAME)を選択したいと思います

Country(country_id, country_name) 
Publisher(pub_id, pub_name, fk_pub_country) 
Book(book_id, book_name, release_date, fk_book_publisher) 

ようになります。同じ日に複数の本がリリースされた場合は、最高のIDを持つ書籍を取得する必要があります。

私はgroup by -clauseとmaxを使用するだけで、本の名前を含めることはできません。ビュー(country_id、max_date)を選択して出版社や書籍と一緒に参加させると、国ごとに複数の行が表示されることがあります。希望の結果をどのように達成することができますか?あなたは、サブクエリを使用でき

+0

宿題?サンプル・テーブル・データと期待される結果を、フォーマット済みのテキストとして追加します。また、現在のクエリの試行を表示し、何がうまくいかないかを説明します。 – jarlh

答えて

2
SELECT DISTINCT ON (country_id) 
    country_id, 
    book_name 
FROM country 
JOIN publisher ON fk_pub_country = country_id 
JOIN book ON fk_book_publisher = pub_id 
ORDER BY 
    country_id, 
    release_date DESC, 
    book_id DESC 
+0

ありがとう!これはまた、パフォーマンスを考慮すると良い解決策であるようです。 – eko

0

select c.country_id, 
     (select b.book_name 
     from Book b 
      join Publisher p on p.pub_id = b.fk_book_publisher 
     where p.fk_pub_country = c.country_id 
     order by b.release_date desc, b.book_id desc limit 1) as book_name 
from Country c 
0

をあなたは言う:

私はちょうど-clauseとmaxでグループを使用する場合、私は本 名前を含めることはできません。

しかし、あなたはPostgresのボスのようにすることはできません。彼らは(array_agg(...))[1]はあなたが、ちょっと、リストから最初の項目をつかみ、あなたが望むどのように注文しているので

SELECT 
    country_id, 
    (array_agg(book_name))[1] as book_name 
FROM country 
JOIN publisher ON fk_pub_country = country_id 
JOIN book ON fk_book_publisher = pub_id 
GROUP BY country_id ORDER BY release_date DESC; 

:ちょうどそう(未テスト)のような結果の配列からのnソートされたレコードの最初のをつかみますシチューを食べました。

関連する問題