条件排名

时间:2015-12-09 20:37:15

标签: sql oracle analytics rank

所以我的担忧如下:
如果我得到一个"匹配"在第2列我需要排名其他null第1列的分区是可能的吗?因此在下面的示例中,等级为1,2,3,因为在第1列中它与1004相同的第1列(1003)它没有匹配所以我将获得空值

预期输出:

 Column 1 |  Column 2 | Rank
-----------------------------
   1003   |  Match    |   1
   1003   |  Sorias   |   2
   1003   |  Pythn    |   3
   1004   |  Sorias   | null
   1004   |  Pythn    | null
   1004   |  Pythn    | null

2 个答案:

答案 0 :(得分:1)

您可以在窗口函数中使用求和行号。这是一个查询,为您提供所需的输出。

 select x.*, case when sum(match) over (partition by column1) >= 1 then rnk else null end final_rank
   from (select column1, column2, row_number() over (partition by column1 order by column2) rnk, 
           (case when column2 = 'Match' then 1 else 0 end) match
      from table a) x

答案 1 :(得分:1)

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name ( Column1, Column2 ) AS
          SELECT 1003, 'Match'  FROM DUAL
UNION ALL SELECT 1003, 'Sorias' FROM DUAL
UNION ALL SELECT 1003, 'Pythn'  FROM DUAL
UNION ALL SELECT 1004, 'Sorias' FROM DUAL
UNION ALL SELECT 1004, 'Pythn'  FROM DUAL
UNION ALL SELECT 1004, 'Pythn'  FROM DUAL

查询1

SELECT Column1,
       Column2,
       CASE WHEN COUNT( CASE WHEN Column2 = 'Match' THEN 1 END ) OVER ( PARTITION BY Column1 ) > 0
            THEN ROW_NUMBER() OVER ( PARTITION BY Column1 ORDER BY Column2 )
            END AS Rank
FROM   table_name

<强> Results

| COLUMN1 | COLUMN2 |   RANK |
|---------|---------|--------|
|    1003 |   Match |      1 |
|    1003 |   Pythn |      2 |
|    1003 |  Sorias |      3 |
|    1004 |   Pythn | (null) |
|    1004 |   Pythn | (null) |
|    1004 |  Sorias | (null) |