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
但是 为什么 您要将日期存储在 year
、month
和 day
列中,而不是只存储一个 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
我得到了这个代码:
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
但是 为什么 您要将日期存储在 year
、month
和 day
列中,而不是只存储一个 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