Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / создать последовательность значений поля с обнулением по истечению временного интервала / 13 сообщений из 13, страница 1 из 1
31.10.2019, 13:51
    #39883605
arhey85
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
Всем Здравствуйте!

Задача, похоже, простая, но увы...

Есть таблица a, которая, по сути, является отчетной формой, в которой, помимо прочего, для каждой записи есть дата записи (date, тип данных date, задается пользователем в приложении), есть поле для присвоения порядкового номера (regNumber, тип данных varchar) этой записи (речь не про identity) вида "ааа/число", то есть в итоге значения поля должны выглядеть так:

aaa/1
aaa/2
....
aaa/n

нюанс в том, что числовая последовательность должна обнуляться с наступлением нового года (технически - как только в БД появится запись с датой, где год будет больше на один предыдущего), то есть для первой записи за 2020 номер опять должен быть вида "aaa/1";

код приложения подразумевает, что остальные поля (в том числе date) к моменту генерации порядкового номера заполнены;
префикс (ааа), в принципе, могу вынести в код приложения, соответственно, тип данных в поле могу поменять на простой int

загвоздка сейчас в том, чтобы сгенерить это поле номера исходя из трех условий:


1. текущий год, если нет записей - присвоение стартового значения (оно будет больше 1);
2. текущий год, если есть записи - присвоение значения (предыдущее+1)
3. наступил следующий год - присвоение стартового значения (1) и далее по пункту 2



что делал: пробовал через declare выцеплять дату

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
        declare @year varchar (4);
	declare @prefix varchar (4); --установка префикса номера
	set @prefix='aaa';
	declare @Number varchar (5); --установка стартового значения номера (в текущем году оно будет > 1)
	--declare @Number int;
	set @Number='3';
	declare @currentyear varchar (4);  --пробую выцепить год
	set @currentyear='2019';

select @year = (select year(date) from a where regNumber is null) -- выбираю год из той строки, где не присвоен номер

if cast (@year as date)=cast(@currentyear as date) 


begin


update a set regNumber = @prefix+@Number;  --это присвоение первого номера в текущем году

end;

else 
begin 
set @Number='1'
update a set regNumber = @prefix+@Number; --это присвоение первого номера в  следующем году

end;

return 0
end




а вот как прописать присвоение номера к следующей записи (@prefix+(@Number+1)) ?

Также вопрос - возможно, лучше использовать просто update с when ... case?
...
Рейтинг: 0 / 0
31.10.2019, 14:07
    #39883616
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
Схематично. Берём макс. дату из таблицы и сравниваем её год с текущим годом. Равны? плюс 1 к максимальному номеру за текущий год. Иначе - просто 1.
...
Рейтинг: 0 / 0
31.10.2019, 14:16
    #39883623
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
arhey85,

звучит как сиквенс, с reset раз в год
...
Рейтинг: 0 / 0
31.10.2019, 14:23
    #39883625
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
TaPaKarhey85,
звучит как сиквенс, с reset раз в год
С той лишь разничей, что документы у него (судя по описанию) могут проводиться "задним числом"... и да "пациент" будет переживать, если вдруг у него в нумерации появятся "дырки"
...
Рейтинг: 0 / 0
31.10.2019, 14:26
    #39883626
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
arhey85,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
UPDATE a
SET regNumber = a.rn
FROM (

    SELECT a.*, ISNULL(a2.regNumber, 0) + ROW_NUMBER() OVER (PARTITION BY YEAR(a.date) ORDER BY a.date) AS rn
    FROM 
        a
        OUTER APPLY (SELECT MAX(regNumber) regNumber FROM a a2 WHERE YEAR(a.date) = YEAR(a2.date)) a2
    WHERE 
        a.regNumber is NULL
    ) AS a
...
Рейтинг: 0 / 0
31.10.2019, 14:26
    #39883627
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
buserдокументы у него (судя по описанию) могут проводиться "задним числом"Так это ни на что не влияет.
...
Рейтинг: 0 / 0
31.10.2019, 14:28
    #39883630
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
Akinabuserдокументы у него (судя по описанию) могут проводиться "задним числом"Так это ни на что не влияет.
как не влияет, а как же после reset-а генерить номер в прошлом, закрытом периоде?
...
Рейтинг: 0 / 0
31.10.2019, 14:32
    #39883635
arhey85
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
Сорри, забыл указать, СУБД - mssql 2008r2, нет там секвенса (с 2012, вроде только) - увы, mssql не postegres
...
Рейтинг: 0 / 0
31.10.2019, 14:47
    #39883655
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
msLexкак же после reset-а генерить номер в прошлом, закрытом периоде?Берём макс. номер за год, за который вставляется запись, и плюс один. Какие проблемы-то?
...
Рейтинг: 0 / 0
31.10.2019, 14:52
    #39883660
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
msLexкак же после reset-а генерить номер в прошлом, закрытом периоде?
Грубо
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TRIGGER 
ON table
BEFORE UPDATE
SET INSERTED.number = 1 + COALESCE((SELECT MAX(table.number)
                                   FROM table
                                   WHERE YEAR(table.date) = YEAR(INSERTED.date))
                                  , 0)
...
Рейтинг: 0 / 0
31.10.2019, 14:52
    #39883662
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
AkinamsLexкак же после reset-а генерить номер в прошлом, закрытом периоде?Берём макс. номер за год, за который вставляется запись, и плюс один. Какие проблемы-то?
Видимо в том, что это уже не решение через сиквенс, которое комментировал buser
...
Рейтинг: 0 / 0
31.10.2019, 14:53
    #39883664
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
AkinamsLexкак же после reset-а генерить номер в прошлом, закрытом периоде?
Грубо
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TRIGGER 
ON table
BEFORE UPDATE
SET INSERTED.number = 1 + COALESCE((SELECT MAX(table.number)
                                   FROM table
                                   WHERE YEAR(table.date) = YEAR(INSERTED.date))
                                  , 0)





BEFORE UPDATE - это что?

вы веткой ошиблись
...
Рейтинг: 0 / 0
31.10.2019, 16:16
    #39883738
arhey85
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создать последовательность значений поля с обнулением по истечению временного интервала
Minamoto,

Огромное спасибо! То, что нужно!

Всем спасибо за помощь!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / создать последовательность значений поля с обнулением по истечению временного интервала / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]