【发布时间】:2017-09-20 11:58:52
【问题描述】:
我得到了这个代码:
ROW_NUMBER() OVER (partition by ID ORDER BY ID DESC, year DESC, month DESC, day DESC) rank
我想确定开始排名的确切年份、月份和日期。 在那种情况下我应该把这个条件放在哪里?
提前谢谢你!
------------------------------------------ - - - - -编辑: - - - - - - - - - - - - - - - - - - - - -------------
我将详细说明我的情况,以便向您展示我到底想要什么。
让我们使用这个示例表并假设每个日期都有值。
| Year | Month | Day | ID | Rank |
|------|-------|-----|-----------|------------|
| 2017 | 9 | 14 | 9555 | 1 |
| 2017 | 9 | 13 | 9555 | 2 |
| 2017 | 9 | 12 | 9555 | 3 |
| 2017 | 9 | 11 | 9555 | 4 |
| 2017 | 9 | 14 | 3000 | 1 |
| 2017 | 9 | 13 | 3000 | 2 |
| 2017 | 9 | 12 | 3000 | 3 |
| 2017 | 9 | 11 | 3000 | 4 |
这个表是你可以使用下面的代码得到的:
Select *
From (Select Year,
Month,
Day,
ID,
ROW_NUMBER() OVER (partition by ID ORDER BY ID DESC, Year DESC, Month DESC, Day DESC) rank
From table1
Where (Condition)
)
Where Rank < 5;
我们的示例表的条件是最近的行来自 2017 年 9 月 14 日。 我的问题是如何获得 2017 年 9 月 13 日的最后 4 行?
【问题讨论】:
-
所以您希望该日期从 1 开始,而之前的所有其他日期都为空?
-
不知道你想问什么——也许如果你添加了样本数据和预期结果,它会更清楚。但是,我会注意到,在
partition by和order by子句中具有相同的列通常没有任何意义(提示:如果您按特定列进行分区,那么每个分区中的所有行都具有,根据定义,该列中的相同值) -
@xQbert,Damien_The_Unbeliever。我编辑了我的问题,所以你可以理解我在问什么。
-
你不会更新 where 条件(内部查询)来规定
where to_date(Year||lpad(Month,2,0)||lpad(Day,2,0),'YYYYMMDD') <= to_date('13/09/2017','DD/MM/YYYY')吗?转换为日期,因此我不必处理月初边缘情况或闰年等。我只是让日期数据类型为我处理。 -
@xQbert 谢谢,它可以工作,就像上面提到的解决方案 MT0。
标签: sql oracle row-number