0

次の結果を取得するためにOracleでSQLクエリを作成する方法:

テーブル「books」には、BOOK_ID、BOOK_TITLE、BOOK_AUTHOR、PRICE、PUBLISH_DATEの5つの列があります。過去300日間に出版された著者ごとの最も高価な本のリストを印刷しますか?

select book_author, 
       publish_date 
  from books 
 where max(price) and publish_date between (sysdate-300) and sysdate;
4

2 に答える 2

1

分析を使用してこれを達成することもできます。

select * 
  from (select book_id,
               book_author,
               price,
               publish_date,
               row_number() over (partition by book_author order by price desc) rn
          from books
         where publish_date >= (sysdate - 300)
       )
 where rn = 1;
于 2013-01-29T23:35:02.197 に答える
1

目標を達成するにはいくつかの方法があります。これは自己除外結合であり、かなり効率的です。それは基本的に、より高い価格がない価格で行を返すと言います。著者ごとに。ここにテスト済みの例があります: http://sqlfiddle.com/#!4/86b22/1

select 
    b.book_author, b.publish_date, b.price
from 
    books b
    left join books b2
    on b.book_author = b2.book_author
    and b2.price > b.price
    and b2.publish_date between (sysdate-300) and sysdate
where 
    b.publish_date between (sysdate-300) and sysdate
    and b2.book_id is null;

興味がある場合は、このタイプのクエリの他の例を私のブログで見つけることができます: http://adam-bernier.appspot.com/post/38001/the-self-exclusion-join

于 2013-01-29T23:26:20.733 に答える