Row_Number в таблице с ключом, где порядок не имеет смысла - PullRequest
0 голосов
/ 19 января 2020

Я использую 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 и добавить row_number, используя while l oop, но столбец 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).

У вас есть какое-нибудь решение, которое заставило бы меня сложить два столбца рядом друг с другом?

1 Ответ

3 голосов
/ 19 января 2020

Что касается вашего требования, то оно сводится к следующему: присвойте номер от 1 до 3 каждой записи в #t2. Для этого вам не нужна таблица #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;

. Это присвоит столбцу id значение от 1 до 3 для каждой записи в * 1008. *, упорядочено по возрастанию date.

Демонстрация на 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;
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
...