Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автоинкрементный столбец в представлении / 10 сообщений из 10, страница 1 из 1
02.10.2003, 10:57
    #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
02.10.2003, 13:15
    #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
02.10.2003, 14:16
    #32282000
Vel
Vel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементный столбец в представлении
Если хочешь использовать сиквенс, то поставь триггер на вьюху, которая перед доступом обнуляет этом сиквенс
...
Рейтинг: 0 / 0
02.10.2003, 14:17
    #32282002
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементный столбец в представлении
По поводу счетчика - в where наверное можно вставить ф-ю, сбрасывающую значение
(вызывающую setval('sequence_name', 1)) (как это со статич. перем. в Аксесе). Тут надо проверить, сколько раз вызывается в Where ф-я (или любое другое условие), не передающая значения полей.

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

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

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


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

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

Vel:
Опять таки, если есть предложение ORDER By, то будут ли nextval вызываться в порядке, соответствующим окончательному порядку сортировки? (что раньше - сортировка, или выборка).
ORDER BY стоит во VIEW и сортирует по дате, потом по смене.
...
Рейтинг: 0 / 0
02.10.2003, 15:19
    #32282130
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементный столбец в представлении
по поводу триггера на select - было отчень подозрительно :). А вот по сбросу в where пока не проверил. Все остально - "it depends..."
...
Рейтинг: 0 / 0
02.10.2003, 16:05
    #32282248
Vel
Vel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементный столбец в представлении
ну если не катит триггер (хотя у меня вроде катил), то перед select делай обнуление вручную.
Если с nextvalом не катит order, то селект делай в темповую таблицу. а оттуда показывай. Разница в скорости будет очень мала, с учетом того, что из темповой таблицы все будет браться как селект *.
И чтобы не писать каждый раз кучу запросов, все оформляем в функцию и возвращаемым результатом - темповая таблица. У каждого юзверя она будем своя. Прыгать значения не будут.
...
Рейтинг: 0 / 0
03.10.2003, 13:14
    #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
03.10.2003, 14:58
    #32283371
Konrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементный столбец в представлении
Господа, всем спасибо. В проблеме разобрался (в т.ч. и с помощью предложенных здесь советов).
...
Рейтинг: 0 / 0
03.10.2003, 15:29
    #32283439
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементный столбец в представлении
Очень интересно, как вы ее решили, потому что 1) сам давно задавался подобным вопросом, 2) способ предложенный мною кажется не совсем корректным потому что вроде бы может "сломаться" при смене плана выполнения запроса (где гарантия что setval выполнится перед nextval-ами).
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Автоинкрементный столбец в представлении / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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