4

Oracle でいくつかの列をランク付けする際に問題が発生しています。ランク付けする必要がある列が 2 つあります。グループ ID と日付です。

テーブルを次の 2 つの方法でグループ化します。

  1. 各 GROUP_ID のレコードを DATETIME (RANK_1) でランク付けします
  2. GROUP_ID を DATETIME、GROUP_ID (RANK_2) でランク付けします。

次のようになります。

GROUP_ID  |    DATE    |   RANK_1  |  RANK_2
----------|------------|-----------|----------
    2     |  1/1/2012  |      1    |    1
    2     |  1/2/2012  |      2    |    1
    2     |  1/4/2012  |      3    |    1   
    3     |  1/1/2012  |      1    |    2
    1     |  1/3/2012  |      1    |    3

私は前者を行うことができましたが、後者を理解することができませんでした。

SELECT   group_id,
         datetime,
         ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY datetime) AS rn,
         DENSE_RANK() OVER (ORDER BY group_id) AS rn2
FROM     table_1
ORDER BY group_id;

これは、RANK_2 フィールドの順序を誤っています。

GROUP_ID  |    DATE    |   RANK_1  |  RANK_2
----------|------------|-----------|----------
    1     |  1/3/2012  |     1     |    1
    2     |  1/1/2012  |     1     |    2
    2     |  1/2/2012  |     2     |    2
    2     |  1/4/2012  |     3     |    2
    3     |  1/1/2012  |     1     |    3
4

1 に答える 1

3

テーブルに実際のid列がないと仮定すると、各グループの最も早い日付で2番目のランクを実行したいようです。これには、ネストされたサブクエリが必要です。

select group_id,  datetime, rn,
       dense_rank() over (order by EarliestDate, group_id) as rn2
from (SELECT group_id,  datetime, 
             ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY datetime) AS rn, 
             min(datetime) OVER (partition by group_id) as EarliestDate
      FROM table_1
     ) t
ORDER BY group_id; 
于 2012-07-09T17:59:27.320 に答える