- PR -

SQL文について

投稿者投稿内容
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-01-24 16:14
引用:

引用:

コード:
SELECT a.code, a.date, a.tanka
FROM tbl a
,(SELECT no FROM tbl WHERE date in (SELECT max(date) FROM tbl GROUP by code)) b
WHERE a.no = b.no
ORDER BY a.code;


これで、codeとdateにインデックス張っていればコスト8出ます。


これだと、
6行目に
no code date tanka
-----------------------
06 0001 2008/01/02 500
とかあったらOUTじゃないですか?


あっ、気づいて修正しようと思ったらすでに指摘が・・・
先越されないように急いでやっつけ仕事をしてしまいました。
申し訳ないです。そしてご指摘ありがとうございます。

私も、上総のさんの書いたコードで目指すところへ行ける、と思います。
ノラ
常連さん
会議室デビュー日: 2003/11/06
投稿数: 37
お住まい・勤務地: 東京都
投稿日時: 2008-02-24 07:21
OLAP関数が使える環境なら
コード:
select code,date,tanka
from ( select no,code,date,tanka, 
       row_number() over( partition by code order by date desc ) as rn from tbl ) as t
where rn = 1;

忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-02-24 08:49
Oracleでの実機確認の環境がないのですが。。。

1.分析関数が使える場合のSQL例

コード:
select
  x.code,x.date,x.tanka
 from
  (select
     no,code,date,tanka,
     rank() over(partition by code order by date desc) as rk
    from tbl) as x
 where x.rk=1
 order by x.code




2.分析関数が使えない場合のSQL例

コード:
select
  code,date,tanka
 from tbl as x
 where date=(select max(date)
                       from tbl
                       where x.code=code)
 order by code



3.性能改善が期待できそうなインデクスの定義例

コード:
create unique tblidx1 on tbl(code,date desc)

未記入
会議室デビュー日: 2008/02/25
投稿数: 1
投稿日時: 2008-02-25 17:19
SQL> with tt as (
2 select '01' no, '0001' code, '2008/01/01' new_date, '100' tanka from dual union all
3 select '02', '0001', '2008/01/05', '200' from dual union all
4 select '03', '0002', '2008/01/06', '100' from dual union all
5 select '04', '0003', '2008/01/01', '100' from dual union all
6 select '05', '0003', '2008/01/02', '90' from dual
7 )
8 select * from(
9 select t1.*,
10 dense_rank() over(partition by t1.code order by t1.new_date desc) rank
11 from tt t1
12 )t2
13 where t2.rank = 1
14 /

NO CODE NEW_DATE TAN RANK
-- ---- ---------- --- ----------
02 0001 2008/01/05 200 1
03 0002 2008/01/06 100 1
05 0003 2008/01/02 90 1

SQL>

スキルアップ/キャリアアップ(JOB@IT)