2

私は以下のようなテーブルを持っています

スキーマ:ID | カテゴリ| キーワード| 入札価格

カテゴリごとの入札価格に基づいて上位5つのキーワードを取得するSQLを記述します。

詳細:

oracle 10.xで考慮されるテーブル定義:

create table test (
    ID number,
    Category varchar (20),
    Keyword varchar (20),
    BidPrice number
);

データ:

insert into test values (1, 'Category-A', 'Keyword-A1', 110);
insert into test values (2, 'Category-A', 'Keyword-A2', 121);
insert into test values (3, 'Category-A', 'Keyword-A3', 130);
insert into test values (4, 'Category-A', 'Keyword-A4', 125);
insert into test values (5, 'Category-A', 'Keyword-A5', 115);
insert into test values (6, 'Category-A', 'Keyword-A6', 133);
insert into test values (7, 'Category-B', 'Keyword-B1', 105);
insert into test values (8, 'Category-B', 'Keyword-B2', 111);
insert into test values (9, 'Category-B', 'Keyword-B3', 108);
insert into test values (10, 'Category-B', 'Keyword-B4', 128);
insert into test values (11, 'Category-B', 'Keyword-B5', 144);
insert into test values (12, 'Category-B', 'Keyword-B6', 101);
insert into test values (13, 'Category-C', 'Keyword-C1', 150);
insert into test values (14, 'Category-C', 'Keyword-C2', 137);
insert into test values (15, 'Category-C', 'Keyword-C3', 126);
insert into test values (16, 'Category-C', 'Keyword-C4', 121);
insert into test values (17, 'Category-C', 'Keyword-C5', 112);
insert into test values (18, 'Category-C', 'Keyword-C6', 118);

期待される出力:

KEYWORD         CATEGORY      BIDPRICE
--------------  ------------  ----------
Keyword-A6      Category-A    133
Keyword-A3      Category-A    130
Keyword-A4      Category-A    125
Keyword-A2      Category-A    121
Keyword-A5      Category-A    115
Keyword-B5      Category-B    144
Keyword-B4      Category-B    128
Keyword-B2      Category-B    111
Keyword-B3      Category-B    108
Keyword-B1      Category-B    105
Keyword-C1      Category-C    150
Keyword-C2      Category-C    137
Keyword-C3      Category-C    126
Keyword-C4      Category-C    121
Keyword-C6      Category-C    118 

注:回答は、Oracleまたはデータベース固有の関数を使用せずにSQLでのみ行う必要があります。

4

3 に答える 3

4

これを試して:

select KEYWORD, CATEGORY ,BIDPRICE 
from 
(
  select KEYWORD, CATEGORY ,BIDPRICE , 
         ROW_NUMBER() over (partition by Category order by BidPrice desc)  as rn
  from test
) a
where a.rn <= 5;


SQLフィドルデモ

于 2012-11-06T06:03:04.967 に答える
3

利用するROW_NUMBER()

SELECT KEYWORD ,CATEGORY, BIDPRICE
FROM
(
  SELECT KEYWORD ,CATEGORY, BIDPRICE,
          ROW_NUMBER() OVER (PARTITION BY CATEGORY ORDER BY BIDPRICE DESC) rn
  FROM test
) a
WHERE rn <= 5
ORDER BY CATEGORY, BIDPRICE DESC
于 2012-11-06T06:00:52.103 に答える
0

このクエリを実行しましたが、最大の場合は6行目を残しています。誰かがこれを助けることができますか?

select a.keyword, a.category, a.bidprice
from
  test a,
  (
    select b.id, b.category
    from test b
    where (select distinct(c.category) from test c where b.category=c.category) = b.category
  ) xx
where a.id in (select ss.id from test ss where a.category=ss.category and rownum<=5)
group by a.category, a.bidprice, a.keyword
order by a.category, a.bidprice desc;

彼ら、

私はそれを解決しました、これを考慮してください:

select a.keyword, a.category, a.bidprice
from
  test a,
  (
    select b.id, b.category
    from test b
    where (select distinct(c.category) from test c where b.category=c.category) = b.category
    order by b.bidprice desc
  ) xx
where a.id in (
  select id
  from (select dd.id, dd.category from test dd order by dd.bidprice desc) ss
  where a.category=ss.category
    and rownum<=5
)
group by a.category, a.bidprice, a.keyword
order by a.category, a.bidprice desc;
于 2012-11-06T08:50:55.213 に答える