我的桌子是这样的:
项目 | 日期 |
---|---|
EO124 | 2023年7月25日 |
E0124 | 2023年8月1日 |
EO124 | 10-05-2023 |
EO124 | 2023年10月12日 |
EO124 | 2023年10月11日 |
EO124 | 2023年11月17日 |
EO124 | 12-01-2023 |
在我的表中,还有多个项目名称和其他字段。我的要求是按升序排列所有项目的结束日期。
我尝试过这样但失败了。
SELECT TOP
[Date],
[Project]
RANK() OVER(PARTITION BY [Project_Name] ORDER BY [End_Date]asc) Rank
FROM Table_Name
我尝试过这样但失败了。
这样的描述根本没有给我们任何信息。 第一个“失败”(如评论中指出的)是错误“‘日期’附近的语法不正确”。 - 因为您在
TOP
之后没有提供号码。通常像这样的家庭作业问题会需要“排名最高的项目”,并且您会使用 TOP 1
但我现在会使用 TOP 100
- 很快就会使用。
您的下一个“失败”(也在评论中指出)是错误“')'附近的语法不正确。” - 因为你错过了[Project]之后/RANK之前的逗号。
RANK
的结果本质上是结果中的一列,并且需要位于要返回的列列表中。列表中的项目以逗号分隔。
下一个“失败”是两条消息 - “无效的列名“Project_Name”。”和“无效的列名‘End_Date’。”。这些都在您的
OVER
子句中。您在示例中没有向我们提供这些列。我以为你的意思是[项目]和[日期],这给了我看起来像这样的代码RANK
生成结果
SELECT TOP 100
[Date],
[Project],
RANK() OVER (PARTITION BY [Project] ORDER BY [Date] asc) [Rank]
FROM Table_Name
这让我回到
Date Project Rank
2023-08-01 E0124 1
2023-07-25 EO124 1
2023-10-05 EO124 2
2023-10-12 EO124 3
2023-11-10 EO124 4
2023-11-17 EO124 5
2023-12-01 EO124 6
之后的数字 - 请注意,有超过 1 行的排名为“1” - 这是因为您在第二个数据项中使用 0 而不是 O 的输入错误。一旦您更正,您可以使用
TOP
但这不考虑多个项目。因此,您想要的是一个子查询(或表变量、临时表或 CTE),您可以使用 TOP 1
子句进行过滤,例如WHERE