是否可以使用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
ie: 除32和64以外的所有其他类型一起编号。类型32和64的编号是可选的,因为我只需要对其他类型进行排序。
我真正想做的是检索类型为32和64的所有行,并且仅从其他类型中检索具有最低日期的行。我问这个具体问题的原因是,在未来,我可能需要检索的不仅仅是第一列,我认为如果我能像那样给我的行编号会更容易。如果你有别的办法,我洗耳恭听。
当然可以有复杂的分区表达式,就像可以有复杂的分组表达式一样。以下是在示例中对行进行排序的一种可能方法:
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