使用row_number()通过分区生成计算列

时间:2017-01-21 09:55:00

标签: sql sql-server tsql data-structures database-design

我想基于状态和数据库中出现的次数生成包含唯一编号的列

就像

Ny_1
Ny_2
St_1
Ny_3
St_2
Up_1
Ny_4

等等......

我想要一个持久的计算列

其他栏必须像

Name   |  state   |  total    |  ticket no
Abc    |  Ny      |  1        |  Ny_1
Cda.   |  Ny      |  2        |  NY_2
Xyz.   |  St      |  1        |  ST_1

我可以使用partition by在视图中生成它 并连接结果

但是我不确定我是否可以创建一个基于row_number()的计算列(按某种顺序按某种顺序分区)

只需2个问题

1)我可以在计算列中使用分区

2)是否有更好的方法

(从评论中更新:)

看看我想要生成的列将成为主键...所有其他列都附加到它......这是业务需求......它必须以这种方式完成。 ..

我必须在数据库中生成一个票号,它应该像...状态中的票数的State_number这是所有数据库将附加到的号码。

这是我要转换为sql表的excel表...这是我正在谈论的票号...它必须以这种方式生成。

2 个答案:

答案 0 :(得分:0)

Computed column我们无法使用window个功能,您可以转到View

CREATE VIEW state_num
AS
  SELECT state,
         seq_state = state
                     + Cast(Row_number()OVER(partition BY state ORDER BY state) AS VARCHAR(50))
  FROM   yourtable 

如果您使用的是SQL SERVER 2012及更高版本,请使用不需要显式转换的CONCAT功能。

CREATE VIEW state_num
AS
  SELECT state,
         seq_state = Concat(state, Row_number()OVER(partition BY state ORDER BY state))
  FROM   yourtable 

答案 1 :(得分:0)

  

问题1 )我可以在计算列中使用[window] with [partition]分区吗?

回答:是的,通过使用函数返回值,但是不是 persisted,因为它是不确定的。

  

问题2 )有更好的方法吗?

回答:是的,这应该作为主键。

为什么您希望这是您的主键?

说这是一项业务要求并不能让它成为一个好主意。找到另一种方法来满足您的业务需求,而不会迫使您做出可怕的设计决策。