【问题标题】:How to create a generated sequential number in a computed value in a select statement in SQL Server?如何在 SQL Server 的 select 语句中的计算值中创建生成的序号?
【发布时间】:2021-01-10 03:15:33
【问题描述】:

我想在一个数字中添加一个序列号作为 Select 中的计算列。我尝试了以下但 SomeNumber = 50001 对于两行这意味着 Row_Number 似乎每行都重置为 1。我想生成一个数字,它为每一行递增并将其添加到 50000 并为每一行获取一个唯一的 SomeNumber 值。它需要在视图中工作。没有 Sprocs。 SQL Server 2008。我更愿意避免使用 SQL Server 的序列功能。该表已经有一个主键,它的值不能用于添加到 50000。50000 实际上是一个计算数字,如果向其中添加大数字,它可能会溢出 Int,因此我想添加1, 2, 3, ... 以减少发生这种情况的机会。

CREATE TABLE example
( name VARCHAR(10),
  RN int)

INSERT INTO example
SELECT 'John', 1
UNION 
SELECT 'Jane', 1

SELECT ROW_NUMBER() OVER(PARTITION BY RN ORDER BY RN) RowNumber,
(SELECT 50000 + ROW_NUMBER() OVER(PARTITION BY RN ORDER BY RN)) SomeNumber  <== value doesn't change
FROM example

【问题讨论】:

  • 值不稳定是否重要,即随着行的插入、更新和删除,'John' 的计算值可能会改变?或者可以在不更改表格数据的情况下进行更改,例如使用不能提供太多保证订单的order by (select null)
  • 没关系。 SomeNumber 值用作 UI 的临时键。它不在乎价值。他们只需要独一无二。另外,我太早接受了@SteveC 的回答。实际上是不正确的。

标签: sql-server tsql sql-server-2008


【解决方案1】:

[编辑] 基于 cmets 现在有 2 个表,#example 和 #other,它们由公共列 RN 关联。 #other 包含 SomeNumber 整数列。该查询将 RN 上的表连接在一起,并将序列号添加到每个 RN 的 SomeNumber 值。

drop table if exists #example;
go
CREATE TABLE #example
( name           VARCHAR(10),
  RN             int);

INSERT INTO #example
SELECT 'John', 1
UNION all
SELECT 'Jane', 1
UNION all
SELECT 'Jack', 2
UNION all
SELECT 'Jill', 2;

drop table if exists #other;
go
CREATE TABLE #other
( SomeNumber    int,
  RN            int);

INSERT INTO #other
SELECT 50000, 1
UNION 
SELECT 40000, 2;

查询

select e.*, oth.max_n+row_number() over (order by (select null)) seq_num
from #example e
     cross join (select max(o.SomeNumber) max_n from #other o) oth;

输出

name    RN  seq_num
John    1   50001
Jane    1   50002
Jack    2   50003
Jill    2   50004

【讨论】:

  • 实际上你的回答不是我问题的答案,我正在撤回我的投票。唯一编号必须是我拥有的方式。所有行仍然是 50001。 SELECT ROW_NUMBER() OVER(PARTITION BY RN ORDER BY RN) RowNumber, (SELECT 50000 + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) ) SomeNumber FROM 示例
  • 请提供您要查找的输出
  • 1, 50001 2, 50002 使用内联选择,如我的问题所示
  • 我试图简化事情。实际查询是这样的:SELECT column1, (SELECT MAX(somecolumn) + x FROM anothertable) from table。我希望 x 从 1 开始递增。
  • 它似乎也不起作用。我的表中没有数字。我需要从另一个表中找出最大的 somenumber 并添加一个序号。这就是为什么我有内部选择来找到最大值(某个数字)。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2021-01-28
  • 1970-01-01
  • 2020-01-31
  • 2016-12-18
  • 2011-09-08
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多