SQL Oracle使用ROW_NUMBER()指定起始点

时间:2017-09-20 11:58:53

标签: sql oracle row-number

我收到了这段代码:

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日开始。 我的问题是我如何才能从13/09/2017获得最后4行?

1 个答案:

答案 0 :(得分:1)

使用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数据类型?< / p>

<强>更新

  

我怎么能从13/09/2017获得最后4行

这将仅将您的排名应用于2017-09-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