powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автоинкрементный столбец в представлении
10 сообщений из 10, страница 1 из 1
Автоинкрементный столбец в представлении
    #32281585
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Господа, проблема такая: есть таблица, где хранится ежедневная выработка продукции, при чем по сменам. Вид упрощенно такой:
Код: plaintext
CREATE TABLE issue (issue_id SERIAL, issue_amount FLOAT, issue_date DATE, issue_shift CHAR( 1 ), issue_prod_id INT4);

Где issue_amount - собственно, величина выработки, issue_date - дата выработки, issue_shift - смена, которая выработала продукцию (может быть 1 или 2), issue_prod_id - идентификатор продукции (FK).

Создаю представление (VIEW), которое отображает сумму выработки всей продукции посменно (и по датам, соотв-но). Например, исходные данные такие:

Число: 01.10.
Первая смена: Аммиак - 350, Лактам - 1000. Вторая смена: Аммиак - 400, Лактам - 500.
Число: 02.10.
Первая смена: Аммиак - 250, Лактам - 800. Вторая смена: Аммиак - 500, Лактам - 700.


В представлении у меня будет след. информация:
Код: plaintext
1.
2.
3.
4.
5.
Число   Смена       Выработка
 01 . 10 .        1                1350 
 01 . 10 .        2                900 
 02 . 10 .        1                1050 
 02 . 10 .        2                1200 


Вопрос такой: как в этом представлении добавить автоинкрементное поле? Это нужно для отображения очередности смен, т.е. 1-я смена 01.10 была раньше, чем 2-я 01.10. А 2-я смена 01.10, соотв, раньше, чем 1-я 02.10. Иными словами. VIEW должен иметь такой вид:
Код: plaintext
1.
2.
3.
4.
5.
Порядок   Число   Смена       Выработка
     1             01 . 10 .        1                1350 
     2             01 . 10 .        2                900 
     3             02 . 10 .        1                1050 
     4             02 . 10 .        2                1200 

Есть ли какая-нибудь для этого функция?
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32281862
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла идея сделать SEQUENCE и выводить во VIEW его nextval. Но в этом случае с каждой выборкой из VIEW нумерация возрастает на количество имеющихся записей. Т.е. SELECT первый раз даст хорошую картину:
Код: plaintext
1.
2.
3.
4.
5.
Порядок   Число   Смена       Выработка
     1        01 . 10 .      1            1350 
     2        01 . 10 .      2            900 
     3        02 . 10 .      1            1050 
     4        02 . 10 .      2            1200 


Еще одна выборка:
Код: plaintext
1.
2.
3.
4.
5.
Порядок   Число   Смена       Выработка
     5        01 . 10 .      1            1350 
     6        01 . 10 .      2            900 
     7        02 . 10 .      1            1050 
     8        02 . 10 .      2            1200 


И т.д. Что не есть гуд, так как с учетом того, что таблица регулярно пополняется, а представление еще более регулярно просматривается, то числа будут расти в хз какой последовательности (явно не арифметической и даже не геометрической)...
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32282000
Vel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хочешь использовать сиквенс, то поставь триггер на вьюху, которая перед доступом обнуляет этом сиквенс
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32282002
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу счетчика - в where наверное можно вставить ф-ю, сбрасывающую значение
(вызывающую setval('sequence_name', 1)) (как это со статич. перем. в Аксесе). Тут надо проверить, сколько раз вызывается в Where ф-я (или любое другое условие), не передающая значения полей.

Но это плёхо - а если нескоко юзерей поюзают счетчик (отдается ли счетчик всем по мере надобности, или только по очереди захватывается некими процессами-запросами)? Тогда даже проинициализированный счетчик выдаст разрывы.

Есть агрегатные ф-ии. Но их нельзя юзать в обычном запросе. Только через подчиненный группирующий. Что (обычно) приводит к квадратичному росту времени счета.

Опять таки, если есть предложение ORDER By, то будут ли nextval вызываться в порядке, соответствующим окончательному порядку сортировки? (что раньше - сортировка, или выборка).


И хде наши гуру? Ау!
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32282018
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vel:
Если хочешь использовать сиквенс, то поставь триггер на вьюху, которая перед доступом обнуляет этом сиквенс

Была идея :), но триггер на view не повесишь, да и событие SELECT триггер не прожует.. :(

Vel:
Опять таки, если есть предложение ORDER By, то будут ли nextval вызываться в порядке, соответствующим окончательному порядку сортировки? (что раньше - сортировка, или выборка).
ORDER BY стоит во VIEW и сортирует по дате, потом по смене.
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32282130
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу триггера на select - было отчень подозрительно :). А вот по сбросу в where пока не проверил. Все остально - "it depends..."
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32282248
Vel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну если не катит триггер (хотя у меня вроде катил), то перед select делай обнуление вручную.
Если с nextvalом не катит order, то селект делай в темповую таблицу. а оттуда показывай. Разница в скорости будет очень мала, с учетом того, что из темповой таблицы все будет браться как селект *.
И чтобы не писать каждый раз кучу запросов, все оформляем в функцию и возвращаемым результатом - темповая таблица. У каждого юзверя она будем своя. Прыгать значения не будут.
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32283178
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create sequence s_issue minvalue 0;

create view v_issue as select nextval('s_issue') as ordr, a.* from ( select sum(issue_amount) as issue_amount, issue_date, issue_shift from issue group by issue_date, issue_shift order by issue_date, issue_shift ) as a, setval('s_issue',0) as b;
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32283371
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, всем спасибо. В проблеме разобрался (в т.ч. и с помощью предложенных здесь советов).
...
Рейтинг: 0 / 0
Автоинкрементный столбец в представлении
    #32283439
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень интересно, как вы ее решили, потому что 1) сам давно задавался подобным вопросом, 2) способ предложенный мною кажется не совсем корректным потому что вроде бы может "сломаться" при смене плана выполнения запроса (где гарантия что setval выполнится перед nextval-ами).
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автоинкрементный столбец в представлении
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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