【问题标题】:Row_Number in table with key where ordering does not make sense表中的 Row_Number 键,其中排序没有意义
【发布时间】:2020-05-05 21:41:30
【问题描述】:

我正在使用 T-SQL。

我有一个临时表 #t2,其中只有一个名为 internal 的列。

列的值是 n 乘以从 1 到 3 的序列

即: 1 2 3 1 2 3 1 2 3 ...

我想将此列添加到另一个临时表#t1,它只有一个名为Date 的日期列(假设两个表的行数相同)。

如果我想使用连接,我需要一个on 子句,但我没有任何有意义的键。此外,cross join 不起作用,因为它增加了列数。因此,我想在每个表中添加一个row_number,并在新形成的 row_number 列上进行内部连接。

但是,row_number 需要一个 order by 子句,而 #t1 包含列 Date 对排序有意义,而表 #t2 不需要,因此 row_number 解决方案也不起作用。

我尝试将id 列添加到表#t2 并使用while 循环添加row_number,但id 列仅由NULL 值填充。

ALTER TABLE #t2
ADD id integer;

declare @iterFlag integer
declare @iteration2 integer
set @iteration2 = (select count(internal) from #t2)
--print @iteration2

set @intFlag = 1
while (@intFlag <= @iteration2)
begin

        INSERT INTO  #t2 (id)
        VALUES (@intFlag)


SET @intFlag = @intFlag + 1
end;
go

如果不使用

INSERT INTO  #t2 (id)
VALUES (@intFlag)

我使用:

UPDATE #t2
SET id = @intFlag

那么我只得到(select count(internal) from #t2)的结果。

您有什么解决方案可以让我将两列并排堆叠吗?

【问题讨论】:

  • 请包括表格 DDL、样本数据和所需结果。
  • 您可以按常量/空值排序:ROW_NUMBER() OVER(ORDER BY (SELECT NULL))

标签: sql sql-server tsql date window-functions


【解决方案1】:

就您的要求而言,归结为:为#t2 中的每条记录分配一个介于 1 和 3 之间的数字。为此,您不需要表#t1,您可以使用row_number()

alter table #t2 add id integer;

with cte as (select id, row_number() over(order by date) - 1 rn from #t2)
update cte set id = 1 + rn % 3;

这将为#t2 中的每条记录分配一个介于1 和3 之间的值到列id,按增加的date 排序。

Demo on DB Fiddle

create table #t2 (date datetime);

insert into #t2 values 
    ('2020-01-01'), 
    ('2020-01-02'), 
    ('2020-01-03'), 
    ('2020-01-04'), 
    ('2020-01-05'),
    ('2020-01-06'),
    ('2020-01-07');
-- 7 rows affected

alter table #t2 add id integer;

with cte as (select id, row_number() over(order by date) - 1 rn from #t2)
update cte set id = 1 + rn % 3;
-- 7 rows affected

select * from #t2 order by date;
日期 | ID :------------------------ | -: 2020-01-01 00:00:00.000 | 1 2020-01-02 00:00:00.000 | 2 2020-01-03 00:00:00.000 | 3 2020-01-04 00:00:00.000 | 1 2020-01-05 00:00:00.000 | 2 2020-01-06 00:00:00.000 | 3 2020-01-07 00:00:00.000 | 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多