powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / создать последовательность значений поля с обнулением по истечению временного интервала
13 сообщений из 13, страница 1 из 1
создать последовательность значений поля с обнулением по истечению временного интервала
    #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
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883616
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Схематично. Берём макс. дату из таблицы и сравниваем её год с текущим годом. Равны? плюс 1 к максимальному номеру за текущий год. Иначе - просто 1.
...
Рейтинг: 0 / 0
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883623
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arhey85,

звучит как сиквенс, с reset раз в год
...
Рейтинг: 0 / 0
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883625
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKarhey85,
звучит как сиквенс, с reset раз в год
С той лишь разничей, что документы у него (судя по описанию) могут проводиться "задним числом"... и да "пациент" будет переживать, если вдруг у него в нумерации появятся "дырки"
...
Рейтинг: 0 / 0
создать последовательность значений поля с обнулением по истечению временного интервала
    #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
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883627
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserдокументы у него (судя по описанию) могут проводиться "задним числом"Так это ни на что не влияет.
...
Рейтинг: 0 / 0
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883630
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinabuserдокументы у него (судя по описанию) могут проводиться "задним числом"Так это ни на что не влияет.
как не влияет, а как же после reset-а генерить номер в прошлом, закрытом периоде?
...
Рейтинг: 0 / 0
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883635
arhey85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, забыл указать, СУБД - mssql 2008r2, нет там секвенса (с 2012, вроде только) - увы, mssql не postegres
...
Рейтинг: 0 / 0
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883655
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexкак же после reset-а генерить номер в прошлом, закрытом периоде?Берём макс. номер за год, за который вставляется запись, и плюс один. Какие проблемы-то?
...
Рейтинг: 0 / 0
создать последовательность значений поля с обнулением по истечению временного интервала
    #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
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883662
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinamsLexкак же после reset-а генерить номер в прошлом, закрытом периоде?Берём макс. номер за год, за который вставляется запись, и плюс один. Какие проблемы-то?
Видимо в том, что это уже не решение через сиквенс, которое комментировал buser
...
Рейтинг: 0 / 0
создать последовательность значений поля с обнулением по истечению временного интервала
    #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
создать последовательность значений поля с обнулением по истечению временного интервала
    #39883738
arhey85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Minamoto,

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

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


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