Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle在多个字段上对列进行排名_Sql_Oracle_Ranking - Fatal编程技术网

Sql Oracle在多个字段上对列进行排名

Sql Oracle在多个字段上对列进行排名,sql,oracle,ranking,Sql,Oracle,Ranking,我在Oracle中对某些列进行排名时遇到了一些问题。我需要对两列进行排序——一个组id和一个日期 我想以两种方式将表分组: 按日期时间对每个组\u ID中的记录进行排名(排名\u 1) 按日期时间对组ID进行排序,组ID(排名2) 应该是这样的: GROUP_ID | DATE | RANK_1 | RANK_2 ----------|------------|-----------|---------- 2 | 1/1/2012 | 1

我在Oracle中对某些列进行排名时遇到了一些问题。我需要对两列进行排序——一个组id和一个日期

我想以两种方式将表分组:

  • 按日期时间对每个组\u ID中的记录进行排名(排名\u 1)
  • 按日期时间对组ID进行排序,组ID(排名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;
    
    这会错误地排列秩_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
    

    假设表中没有实际的id列,则似乎希望按每个组中最早的日期进行第二次排序。这将需要一个嵌套的子查询:

    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; 
    

    第一种方式和第二种方式有何不同,因为在这两种情况下,分区都基于组id?