2

私は3つのテーブルを持っています:

publisher (id serial pkey, pub_name text)
book (id serial pkey, id_pub INTEGER NOT NULL REFERENCES publisher (id), book_name TEXT)
rank (id SERIAL PKEY, id_book INTEGER NOT NULL REFERENCES book (id), week DATE, selling INTEGER)

そして、出版社ごとに最も売れている本だけをリストしたいと考えています。私が今持っているものは、すべての本の販売を返します:

SELECT publisher.pub_name, book.book_name, SUM(rank.selling)
 FROM rank, publisher, book
 WHERE rank.id_book = book.id AND book.id_pub = publisher.id
 GROUP BY publisher.pub_name, book.book_name;

そのように返します:

BigPublisher, Book1, 100300
GoodPublisher, BeBook, 10003
BigPublisher, Book2, 50200
OldPublisher, N-Book, 20009
GoodPublisher, CeBook, 4000
GoodPublisher, DeBook, 3001

そのような結果を探している場所:

BigPublisher, Book1, 100300
GoodPublisher, BeBook, 10003
OldPublisher, N-Book, 20009
4

2 に答える 2

3

ウィンドウ関数を使用します。PostgreSQL ドキュメント のウィンドウ関数のチュートリアルを参照してください。

次のようなものを探しています:

SELECT
  rank() OVER (PARTITION BY publisher ORDER BY sum_of_sold DESC) AS pos
-- ... FROM clause etc here ...
WHERE pos = 1;
于 2013-03-06T19:07:01.620 に答える
1
select
    distinct on (pub_name),
    pub_name,
    book_name,
    selling
from (
    select
        publisher.pub_name,
        book.book_name,
        sum(rank.selling) selling
    from
        publisher
        inner join 
        book on book.id_pub = publisher.id
        inner join
        rank on rank.id_book = book.id
    group by 1, 2
) s
order by pub_name, s.selling desc
于 2013-03-06T19:22:32.110 に答える