我收到了这段代码:
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行?
答案 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
但为什么您是在year
,month
和day
列中存储日期而不只是一个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