具有复杂条件的Row_Number

时间:2011-11-08 18:17:37

标签: sql-server-2005 row-number

除了使用Row_Number()完成的简单分区之外,是否可以使用Group By对其他内容的行进行编号?

这是我的特例:

Id    Type    Date
--    ----    ----
 1      16    Some Date
 2      16    Some Date   
 3      16    Some Date
 4      32    Some Date
 5      64    Some Date
 6      64    Some Date
 7     128    Some Date
 8     256    Some Date
 9     256    Some Date
10     256    Some Date

我想按以下方式对编号进行分区(行编号按日期排序):

Id    Type    RowNb
--    ----    -----
 6      64        1
 4      32        2
 5      64        3
 9     256        1
 3      16        2
 1      16        3
 8     256        4
 7     128        5
 2      16        6
10     256        7

即:除32和64之外的所有其他类型都编号。类型32和64的编号是可选的,因为我只需要对其他类型进行排序。

我真正想做的是检索所有类型为32和64的行,并且仅检索具有最低日期的行。我之所以要问这个具体问题的原因是,将来有可能我不仅要检索第一列,而且我认为如果我可以对这些行进行编号会更容易。如果你有另一个解决方案,我会全力以赴。

1 个答案:

答案 0 :(得分:4)

当然,您可以拥有复杂的分区表达式,就像您可以拥有复杂的分组表达式一样。以下是您在示例中对行进行排名的一种可能方式:

SELECT
  Id,
  Type,
  ROW_NUMBER() OVER (
    PARTITION BY CASE WHEN Type IN (32, 64) THEN 1 ELSE 2 END
    Order BY Date
  )
FROM atable

但是,在过滤要显示的行时,您必须稍后重复该条件。所以,如果我是你,我可能会尝试这样的事情:

WITH marked AS (
  SELECT
    *,
    TypeGroup = CASE WHEN Type IN (32, 64) THEN 1 ELSE 2 END
  FROM atable
),
ranked AS (
  SELECT
    *,
    RowNb = ROW_NUMBER() OVER (PARTITION BY TypeGroup ORDER BY Date)
  FROM
)
SELECT
  Id,
  Type,
  RowNb
FROM ranked
WHERE TypeGroup = 1 OR RowNb = 1
ORDER BY TypeGroup, RowNb