Row_Number со сложными условиями - PullRequest
1 голос
/ 08 ноября 2011

Можно ли использовать 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 Ответ

4 голосов
/ 08 ноября 2011

Конечно, у вас могут быть сложные выражения разбиения, как и у сложных выражений группировки.Вот один из возможных способов ранжирования строк в вашем примере:

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
...