SQL - 查询拆分原始排序

时间:2018-05-30 14:07:57

标签: sql sql-server

我希望我的头衔可以,因为我真的不知道怎么称呼它。

无论如何,我有一张包含以下内容的表格:

  • ID - Num(主键)
  • 类别 - VarChar
  • 姓名 - VarChar
  • DateForName - 日期

数据看起来像这样:

1  100  111  31/12/2017
2  101  210  30/12/2017
3  100  112  29/12/2017
4  101  203  27/12/2017
5  100  117  20/12/2017
6  103  425  08/12/2017

要生成此表,我只按日期DESC排序。

是否可以使用每个类别的订单添加新列,如:

1  100|1
2  101|1
3  100|2
4  101|2
5  100|3
6  103|1

最高

2 个答案:

答案 0 :(得分:3)

您想要分析函数row_number()

select t.*
from (select *, row_number() over (partition by Category order by date desc) Seq
      from table 
      ) t
order by id;

答案 1 :(得分:0)

是的,SQL有几个选项供您添加一个列,该列使用基于category和id列的行排名填充。

如果您只想在select语句中添加一列,我建议使用RANK()函数。 在这里查看更多详情: https://docs.microsoft.com/en-us/sql/t-sql/functions/rank-transact-sql?view=sql-server-2017

对于您当前的表,请尝试以下select语句:

SELECT
[ID],
[Category],
[Name],
[DateForName],
RANK() OVER (PARTITION BY [Category] ORDER BY [DateForName] DESC) AS [CategoryOrder]
FROM [TableName]

或者,如果要将永久列(也称为字段)添加到现有表中,我建议将其视为计算列。在这里查看更多信息: https://docs.microsoft.com/en-us/sql/relational-databases/tables/specify-computed-columns-in-a-table?view=sql-server-2017

因为新列完全基于两个预先存在的列而只有这两列。 SQL可以很好地为您维护。

希望这有帮助!