SQL Oracle 使用 ROW_NUMBER() 指定起点

SQL Oracle Specify start point using ROW_NUMBER()

我得到了这个代码:

ROW_NUMBER() OVER (partition by ID ORDER BY ID DESC, year DESC, month DESC, day DESC) rank

我想确定开始排名的准确年月日。 在那种情况下我应该把这个条件放在哪里?

提前致谢!

---------------------------------------- - - - - - - -编辑: - - - - - - - - - - - - - - - - - - ------------------

我将详细说明我的情况,以便向您展示我真正想要的东西。

让我们使用这个示例 table 并假设每个日期都有值。

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

这个table是你可以使用下面的代码得到的:

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;   

我们的样本 table 的条件是最近的行来自 14/09/2017。 我的问题是如何获取 13/09/2017 的最后 4 行?

使用 CASE 语句:

CASE
  WHEN TO_DATE(
         TO_CHAR( year, 'FM0000' )
         || '-' || TO_CHAR( month, 'FM00' )
         || '-' || TO_CHAR( day, 'FM00' ),
         'YYYY-MM-DD'
       ) > DATE '2017-01-01' -- Your start date
  THEN ROW_NUMBER() OVER (partition by ID
                          ORDER BY ID DESC, year DESC, month DESC, day DESC)
END AS rank

但是 为什么 您要将日期存储在 yearmonthday 列中,而不是只存储一个 DATE数据类型?

更新:

how could I get the last 4 rows from 13/09/2017

这将仅将您的排名应用于 2017 年 9 月 13 日或之前的行:

SELECT *
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER (partition by ID 
                            ORDER BY ID DESC, Year DESC, Month DESC, Day DESC) rank
  FROM   table1 t
  WHERE  TO_DATE(
           TO_CHAR( year, 'FM0000' )
           || '-' || TO_CHAR( month, 'FM00' )
           || '-' || TO_CHAR( day, 'FM00' ),
           'YYYY-MM-DD'
         ) <= DATE '2017-09-13'
)
WHERE rank < 5