将日期从旧到新排列 SQL
Rank a date from oldest to newest SQL
这看起来很简单,但我的大脑无法正常工作,所以我想问一下小组。我想以类似于下面 table 的方式对日期进行排名。此 table 中还有其他字段,但如果日期重复,则同一日期的排名也可能重复,如下所示的 12/31 和 1/5
Date
Rank
12/31/2020
1
12/31/2020
1
1/1/2021
2
1/2/2021
3
1/2/2021
3
1/3/2021
4
1/4/2021
5
1/5/2021
6
1/5/2021
6
1/7/2021
7
1/10/2021
8
我认为你应该使用 DENSE_RANK
和 Distinct
。所以,查询应该看起来像
--Without Duplicate Dates
Select Distinct YouDATE,
DENSE_RANK() OVER(ORDER BY YourDateColumn) MyRANK
FROM YourTable;
--With Duplicate Dates
Select YouDATE,
DENSE_RANK() OVER(ORDER BY YourDateColumn) MyRANK
FROM YourTable;
注意:这段代码写在SQLSERVER中。请检查并告诉我。
你似乎想要dense_rank()
:
select t.*,
dense_rank() over (order by date) as rank
from t;
假设 2021-01-02 的问题是问题中的错字。
如果“日期”上有时间成分,则转换为日期进行排序:
select t.*,
dense_rank() over (order by convert(date, date)) as rank
from t;
这看起来很简单,但我的大脑无法正常工作,所以我想问一下小组。我想以类似于下面 table 的方式对日期进行排名。此 table 中还有其他字段,但如果日期重复,则同一日期的排名也可能重复,如下所示的 12/31 和 1/5
Date | Rank |
---|---|
12/31/2020 | 1 |
12/31/2020 | 1 |
1/1/2021 | 2 |
1/2/2021 | 3 |
1/2/2021 | 3 |
1/3/2021 | 4 |
1/4/2021 | 5 |
1/5/2021 | 6 |
1/5/2021 | 6 |
1/7/2021 | 7 |
1/10/2021 | 8 |
我认为你应该使用 DENSE_RANK
和 Distinct
。所以,查询应该看起来像
--Without Duplicate Dates
Select Distinct YouDATE,
DENSE_RANK() OVER(ORDER BY YourDateColumn) MyRANK
FROM YourTable;
--With Duplicate Dates
Select YouDATE,
DENSE_RANK() OVER(ORDER BY YourDateColumn) MyRANK
FROM YourTable;
注意:这段代码写在SQLSERVER中。请检查并告诉我。
你似乎想要dense_rank()
:
select t.*,
dense_rank() over (order by date) as rank
from t;
假设 2021-01-02 的问题是问题中的错字。
如果“日期”上有时间成分,则转换为日期进行排序:
select t.*,
dense_rank() over (order by convert(date, date)) as rank
from t;