Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Помогите с триггером, пожалуйста  [new]
GlooBus
Member

Откуда:
Сообщений: 63
В общем ситуация следующая, есть таблица:
ID | ID_AGENT | DATA_IN | DATA_OUT

Добавляем в таблицу значение, триггер должен посмотреть в таблицу по ID_AGENT, найти его max(DATA_OUT) и сделав к нему +1 день записать в DATA_IN? Если такой строки нет, тобишь max(DATA_OUT) выдает null, то в DATA_IN пишет '01.01.1900'

Пример, допустим есть строки:
ID |     ID_AGENT |   DATA_IN  | DATA_OUT
 1 |           11 | 01.01.1900 | 10.09.2002
 2 |           11 | 11.09.2002 | 05.03.2010
 3 |           22 | 01.01.1900 | 01.01.2999

Мы хотим добавить запись с ID_AGENT = 11, триггер должен получить макимальное из значений DATA_OUT по данному ID_AGENT и прибавив к нему +1 засунуть в DATA_IN следующей строкой, например:

ID |     ID_AGENT |   DATA_IN  | DATA_OUT
 1 |           11 | 01.01.1900 | 10.09.2002
 2 |           11 | 11.09.2002 | 05.03.2010
 3 |           22 | 01.01.1900 | 01.01.2999
 4 |           11 | 06.03.2010 | 01.01.2999


В PL/SQL не особо шарю, примерно представляю как сделать, но нужен хоть какой нибудь пример.
Спасибо!
12 сен 12, 15:17    [13152361]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
Proteus
Member

Откуда:
Сообщений: 1348
отказаться от столбца Date_in и поднимать его запросом на основании date_out+1
12 сен 12, 15:21    [13152399]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
GlooBus,

ужас просто. вы не только в pl/sql не шарите, но и в азах работы в многопользовательских средах.
срочно концепции читать
12 сен 12, 15:25    [13152438]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
GlooBus
нужен хоть какой нибудь пример.

Какой-нибудь пример триггера можно найти, например, здесь
12 сен 12, 15:31    [13152496]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
UScorp
Member

Откуда: Кыргызстан
Сообщений: 141
orawish
GlooBus,

ужас просто. вы не только в pl/sql не шарите, но и в азах работы в многопользовательских средах.
срочно концепции читать


А может это у него хранилище данных и многопользовательский ввод данных туда не осуществляется.
З.Ы. У нас структура хранилища подобный вид имеет с полями dt_open и dt_close в каждой таблице.
12 сен 12, 15:40    [13152557]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
GlooBus
Member

Откуда:
Сообщений: 63
UScorp
orawish
GlooBus,

ужас просто. вы не только в pl/sql не шарите, но и в азах работы в многопользовательских средах.
срочно концепции читать


А может это у него хранилище данных и многопользовательский ввод данных туда не осуществляется.
З.Ы. У нас структура хранилища подобный вид имеет с полями dt_open и dt_close в каждой таблице.

Именно, таблицу привел как пример. Там значений больше. Это что-то типо лога закрепление одних элементов за группой. Дата начала и конца нужна полюбому. Нет, конечно можно как предложил уважаемый Proteus, надо обмозговать... Спасибо за критику :)
12 сен 12, 15:53    [13152649]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
UScorp
orawish
GlooBus,

ужас просто. вы не только в pl/sql не шарите, но и в азах работы в многопользовательских средах.
срочно концепции читать


А может это у него хранилище данных и многопользовательский ввод данных туда не осуществляется.
З.Ы. У нас структура хранилища подобный вид имеет с полями dt_open и dt_close в каждой таблице.

если режим манипуляции с данными (во что не сильно верится;) монопольно-однозадачный, то, как минимум - предупреждать бы об этом надо.
и всё равно. триггеры тут - за уши притянутая лишняя деталь.
12 сен 12, 16:19    [13152856]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
Proteus
отказаться от столбца Date_in и поднимать его запросом на основании date_out+1
получение данных на выбранную дату выльется из обычного between в танцы с бубнами
12 сен 12, 16:30    [13152959]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
orawish
если режим манипуляции с данными (во что не сильно верится;) монопольно-однозадачный, то, как минимум - предупреждать бы об этом надо.
заблокировать в справочнике "агентов" уникальный ID_AGENT
12 сен 12, 16:32    [13152985]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
Proteus
Member

Откуда:
Сообщений: 1348
andreymx
Proteus
отказаться от столбца Date_in и поднимать его запросом на основании date_out+1
получение данных на выбранную дату выльется из обычного between в танцы с бубнами

Это будет только в том случае если такие запросы будут строится над этой таблицей. А не над материализованным представлением с обоими полями. Такое построение мне кажется более стройным и менее геморройным по сравнению с мутированием и триггерами.
12 сен 12, 16:44    [13153075]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
Proteus
Member

Откуда:
Сообщений: 1348
andreymx
orawish
если режим манипуляции с данными (во что не сильно верится;) монопольно-однозадачный, то, как минимум - предупреждать бы об этом надо.
заблокировать в справочнике "агентов" уникальный ID_AGENT

Блокировки не тот функционал который нужно вешать направо и налево.
Ты еще предложи чтобы в таблице агентов было поле с датой последнего date_out...
12 сен 12, 16:48    [13153112]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
Proteus
Блокировки не тот функционал который нужно вешать направо и налево.[/quote]в данном случае самое то
по смыслу - ты редактируешь документ с конкретным ID_AGENT
12 сен 12, 16:52    [13153142]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54376
Proteus
Это будет только в том случае если такие запросы будут строится над этой таблицей. А не над материализованным представлением с обоими полями. Такое построение мне кажется более стройным и менее геморройным по сравнению с мутированием и триггерами.
мат вьюха? это хорошо
а как ее ты собираешься отслеживать?
12 сен 12, 16:54    [13153151]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
Proteus
Member

Откуда:
Сообщений: 1348
andreymx
Proteus
Это будет только в том случае если такие запросы будут строится над этой таблицей. А не над материализованным представлением с обоими полями. Такое построение мне кажется более стройным и менее геморройным по сравнению с мутированием и триггерами.
мат вьюха? это хорошо
а как ее ты собираешься отслеживать?

никак. один раз сделал и пусть сама рефрешится по коммиту.
12 сен 12, 17:23    [13153390]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
Proteus
Member

Откуда:
Сообщений: 1348
andreymx
Proteus
Блокировки не тот функционал который нужно вешать направо и налево.
в данном случае самое то
по смыслу - ты редактируешь документ с конкретным ID_AGENT[/quot]
а мой сосед другую стоку редактирует с тем же агентом но не дай бог ранее занесенную. И что, кто кого будет ждать...
12 сен 12, 17:25    [13153408]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
GlooBus
Member

Откуда:
Сообщений: 63
Я возможно не правильно начал строить структуру.... Смысл у меня прост:
1. Есть транзакции и точки обслуживания (ТО)
2. Есть Таблица с наименованием групп этих ТО
3. Есть таблица, которая делает связь ТО с наименованием группы.
ТО может отвязаться от одной группы и привязаться к другой, но мне нужно иметь обе строки привязки с датой, мол с такого то по такое то ТО1 была в группе А, а с такого то по такое то она в группе Б. Это нужно для того, что когда взбредет сделать отчет по транзакциям за какой то перилд прошлый, когда ТО1 была еще в группе А (а сейчас она в группе Б). это можно было предусмотреть.

Отчеты, скорее всего, будут делаться помесячно. Но есть возможность, что к примеру ТО1 первые 5 дней месяца была в группе А, потом она перешла в группу Б, потом последние 5 дней месяца опять в группу А.

Грубо говоря план такой. У меня есть входящие параметры, это ИД-группы и период отчета. Я получаю список ТО в группе, у которых дата закрепления или дата открепления попадает в этот диапазон. А теперь самое мутное: я сверяю data_in и data_out закрепления с входящим диапазоном. Мы помним, что у нас одна и та же ТО1 должна быть два раза, т.к. она фигурировала в группе первые и последние 5 дней.

Допустим отчет строим с 01.09.2011 по 30.09.2011. Я беру data_in и сравниваю ее с 01.09.2011, если она меньше (ну ТО закрепили еще в 1999 году), то оставляю 01.09.2011, беру data_out и сравниваю с 30.09.2011, если data_out больше, оставляю 30.09.2011 и с этим диапазоном по этому номеру ТО1 я получаю транзакции из другой таблицы и делаю с ними что хочу. Ето пример случая, когда в течении месяца данная ТО не откреплялась и не закреплялась в группе.
ИЛИ:
- Если data_in больше 01.09.2011, то значит ТО закрепили уже где то в середине отчетного диапазона и за основу для выбора транзакций я беру именно data_in. К примеру ТО1 закрепили data_in=16.09.2011, значит транзакции на этом ТО будем выбирать с этой датой.
- Аналогично с data_out, если она меньше чем 30.09.2011, то значит ТО открепили от группы, и транзакции будем выбирать именно до даты data_out.
- Ну либо ТО закрепили 16.09.2011 и открепили 25.09.2011, то работают сразу два этих условия.

Как то так...
12 сен 12, 17:32    [13153444]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
GlooBus
Member

Откуда:
Сообщений: 63
Proteus
andreymx
пропущено...
Блокировки не тот функционал который нужно вешать направо и налево.
в данном случае самое то
по смыслу - ты редактируешь документ с конкретным ID_AGENT

а мой сосед другую стоку редактирует с тем же агентом но не дай бог ранее занесенную. И что, кто кого будет ждать...[/quot]
Доступ к изменению будет иметь только один человек, извините что сразу не указал :)
12 сен 12, 17:33    [13153456]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
Proteus
Member

Откуда:
Сообщений: 1348
GlooBus
Proteus
пропущено...
в данном случае самое то
по смыслу - ты редактируешь документ с конкретным ID_AGENT

а мой сосед другую стоку редактирует с тем же агентом но не дай бог ранее занесенную. И что, кто кого будет ждать...

Доступ к изменению будет иметь только один человек, извините что сразу не указал :)[/quot]
В таком случае это не все не интересно и пляски с триггерами не имеют смысла.
И второй вопрос что нужно делать если вставляемая строка должна разорвать интервал в строке?
12 сен 12, 18:34    [13153824]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером, пожалуйста  [new]
Proteus
Member

Откуда:
Сообщений: 1348
GlooBus
Я возможно не правильно начал строить структуру.... Смысл у меня прост:
+
1. Есть транзакции и точки обслуживания (ТО)
2. Есть Таблица с наименованием групп этих ТО
3. Есть таблица, которая делает связь ТО с наименованием группы.
ТО может отвязаться от одной группы и привязаться к другой, но мне нужно иметь обе строки привязки с датой, мол с такого то по такое то ТО1 была в группе А, а с такого то по такое то она в группе Б. Это нужно для того, что когда взбредет сделать отчет по транзакциям за какой то перилд прошлый, когда ТО1 была еще в группе А (а сейчас она в группе Б). это можно было предусмотреть.

Отчеты, скорее всего, будут делаться помесячно. Но есть возможность, что к примеру ТО1 первые 5 дней месяца была в группе А, потом она перешла в группу Б, потом последние 5 дней месяца опять в группу А.

Грубо говоря план такой. У меня есть входящие параметры, это ИД-группы и период отчета. Я получаю список ТО в группе, у которых дата закрепления или дата открепления попадает в этот диапазон. А теперь самое мутное: я сверяю data_in и data_out закрепления с входящим диапазоном. Мы помним, что у нас одна и та же ТО1 должна быть два раза, т.к. она фигурировала в группе первые и последние 5 дней.

Допустим отчет строим с 01.09.2011 по 30.09.2011. Я беру data_in и сравниваю ее с 01.09.2011, если она меньше (ну ТО закрепили еще в 1999 году), то оставляю 01.09.2011, беру data_out и сравниваю с 30.09.2011, если data_out больше, оставляю 30.09.2011 и с этим диапазоном по этому номеру ТО1 я получаю транзакции из другой таблицы и делаю с ними что хочу. Ето пример случая, когда в течении месяца данная ТО не откреплялась и не закреплялась в группе.
ИЛИ:
- Если data_in больше 01.09.2011, то значит ТО закрепили уже где то в середине отчетного диапазона и за основу для выбора транзакций я беру именно data_in. К примеру ТО1 закрепили data_in=16.09.2011, значит транзакции на этом ТО будем выбирать с этой датой.
- Аналогично с data_out, если она меньше чем 30.09.2011, то значит ТО открепили от группы, и транзакции будем выбирать именно до даты data_out.
- Ну либо ТО закрепили 16.09.2011 и открепили 25.09.2011, то работают сразу два этих условия.


Как то так...


я перефразирую.
У вас есть список ТО и вам необходимо регистрировать факт перехода ТО от одной группы к другой.
дату перехода вы в дальнейшем будете использовать как границу выборки из списка транзакций.
Если то что я написал это и есть ваша задача то я бы поступил следующим образом
  • создал таблицу -- журнал фактов перехода
  • над ней сделал бы представление о периодах привязки ТО к группам
  • Представление использовал в связке с транзакциями для построения отчетов

    это как бы как поступил бы я. Ваша задача вам и решать как ее реализовать.
  • 12 сен 12, 19:01    [13154012]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с триггером, пожалуйста  [new]
    Изя Кацман
    Member

    Откуда: Великий Эксперимент
    Сообщений: 2019
    GlooBus,
    А почему ты решил ето делать с помощью триггера, камрад?
    12 сен 12, 19:43    [13154226]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с триггером, пожалуйста  [new]
    UScorp
    Member

    Откуда: Кыргызстан
    Сообщений: 141
    GlooBus,

    А почему бы просто не отслеживать дату перехода, без указания даты закрытия, например так (в данном примере дано состояние отчета за 01.03.2012):

    WITH tGroups AS 
    (
      SELECT 1 AS GrID, 'Группа 1' AS GrName FROM dual UNION ALL
      SELECT 2 AS GrID, 'Группа 2' AS GrName FROM dual UNION ALL
      SELECT 3 AS GrID, 'Группа 3' AS GrName FROM dual
    ),
    tStation AS
    (
      SELECT 1 AS StID, 'Станция 1' AS StName FROM dual UNION ALL
      SELECT 2 AS StID, 'Станция 2' AS StName FROM dual UNION ALL
      SELECT 3 AS StID, 'Станция 3' AS StName FROM dual UNION ALL
      SELECT 4 AS StID, 'Станция 4' AS StName FROM dual UNION ALL
      SELECT 5 AS StID, 'Станция 5' AS StName FROM dual
    ),
    tTransactions AS 
    (
      SELECT  1 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  2 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  3 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 3 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  4 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 4 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  5 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 5 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  6 AS TrID, TO_DATE('01.02.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID, 2 AS GrID FROM dual UNION ALL
      SELECT  7 AS TrID, TO_DATE('05.03.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID, 3 AS GrID FROM dual UNION ALL
      SELECT  8 AS TrID, TO_DATE('10.05.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  9 AS TrID, TO_DATE('10.01.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID, 3 AS GrID FROM dual UNION ALL
      SELECT 10 AS TrID, TO_DATE('15.03.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT 11 AS TrID, TO_DATE('01.05.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID, 2 AS GrID FROM dual
    )
    SELECT
      tSt.StName,
      MAX(tGr.GrName) KEEP (DENSE_RANK LAST ORDER BY tTr.TrDate) AS GrName
    FROM 
      tStation           tSt
      JOIN tTransactions tTr ON tTr.StID = tSt.StID
      JOIN tGroups       tGr ON tGr.GrID = tTr.GrID
    WHERE
      tTr.TrDate <= TO_DATE('01.03.2012', 'DD.MM.YYYY')
    GROUP BY
      tSt.StName
    
    13 сен 12, 08:29    [13155393]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с триггером, пожалуйста  [new]
    Proteus
    Member

    Откуда:
    Сообщений: 1348
    UScorp
    GlooBus,

    А почему бы просто не отслеживать дату перехода, без указания даты закрытия, например так (в данном примере дано состояние отчета за 01.03.2012):
    +

    WITH tGroups AS 
    (
      SELECT 1 AS GrID, 'Группа 1' AS GrName FROM dual UNION ALL
      SELECT 2 AS GrID, 'Группа 2' AS GrName FROM dual UNION ALL
      SELECT 3 AS GrID, 'Группа 3' AS GrName FROM dual
    ),
    tStation AS
    (
      SELECT 1 AS StID, 'Станция 1' AS StName FROM dual UNION ALL
      SELECT 2 AS StID, 'Станция 2' AS StName FROM dual UNION ALL
      SELECT 3 AS StID, 'Станция 3' AS StName FROM dual UNION ALL
      SELECT 4 AS StID, 'Станция 4' AS StName FROM dual UNION ALL
      SELECT 5 AS StID, 'Станция 5' AS StName FROM dual
    ),
    tTransactions AS 
    (
      SELECT  1 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  2 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  3 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 3 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  4 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 4 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  5 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 5 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  6 AS TrID, TO_DATE('01.02.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID, 2 AS GrID FROM dual UNION ALL
      SELECT  7 AS TrID, TO_DATE('05.03.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID, 3 AS GrID FROM dual UNION ALL
      SELECT  8 AS TrID, TO_DATE('10.05.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT  9 AS TrID, TO_DATE('10.01.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID, 3 AS GrID FROM dual UNION ALL
      SELECT 10 AS TrID, TO_DATE('15.03.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID, 1 AS GrID FROM dual UNION ALL
      SELECT 11 AS TrID, TO_DATE('01.05.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID, 2 AS GrID FROM dual
    )
    SELECT
      tSt.StName,
      MAX(tGr.GrName) KEEP (DENSE_RANK LAST ORDER BY tTr.TrDate) AS GrName
    FROM 
      tStation           tSt
      JOIN tTransactions tTr ON tTr.StID = tSt.StID
      JOIN tGroups       tGr ON tGr.GrID = tTr.GrID
    WHERE
      tTr.TrDate <= TO_DATE('01.03.2012', 'DD.MM.YYYY')
    GROUP BY
      tSt.StName
    


    Ты вводишь признак группы в таблицу транзакций, чего ТС не говорил. Как я понял таблица транзакций имеет только ключ для привязки к станции. По этому твое решение мне кажется несколько надуманным.
    13 сен 12, 10:54    [13156105]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с триггером, пожалуйста  [new]
    UScorp
    Member

    Откуда: Кыргызстан
    Сообщений: 141
    Proteus,

    Что в лоб, что по лбу. Какая разница, где стоит эта привязка, она по любому где то должна быть, хоть в транзакции, хоть в самих станциях, хоть в третьей таблице.

    Я о том, что зачем иметь дату выхода, если у нас есть дата перехода. Или станция в один момент времени может состоять в нескольких группах?
    13 сен 12, 11:01    [13156151]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с триггером, пожалуйста  [new]
    Proteus
    Member

    Откуда:
    Сообщений: 1348
    UScorp,

    Ну вот тогда и сделай так. убери признак группы из транзакции, сделай еще одну таблицу с привязкой станции к группе, не забудь что эта привязка может меняться во времени и тогда ты увидишь что для того что бы транзакцию привязать к станции и группе тебе нужно связывать по ключу станции и по вхождению даты транзакции в интервал дат входа и выхода станции в/из состава группы.
    13 сен 12, 11:07    [13156220]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с триггером, пожалуйста  [new]
    UScorp
    Member

    Откуда: Кыргызстан
    Сообщений: 141
    Proteus
    UScorp,

    Ну вот тогда и сделай так. убери признак группы из транзакции, сделай еще одну таблицу с привязкой станции к группе, не забудь что эта привязка может меняться во времени и тогда ты увидишь что для того что бы транзакцию привязать к станции и группе тебе нужно связывать по ключу станции и по вхождению даты транзакции в интервал дат входа и выхода станции в/из состава группы.


    Да как-то так:

    WITH tGroups AS 
    (
      SELECT 1 AS GrID, 'Группа 1' AS GrName FROM dual UNION ALL
      SELECT 2 AS GrID, 'Группа 2' AS GrName FROM dual UNION ALL
      SELECT 3 AS GrID, 'Группа 3' AS GrName FROM dual
    ),
    tStation AS
    (
      SELECT 1 AS StID, 'Станция 1' AS StName FROM dual UNION ALL
      SELECT 2 AS StID, 'Станция 2' AS StName FROM dual UNION ALL
      SELECT 3 AS StID, 'Станция 3' AS StName FROM dual UNION ALL
      SELECT 4 AS StID, 'Станция 4' AS StName FROM dual UNION ALL
      SELECT 5 AS StID, 'Станция 5' AS StName FROM dual
    ),
    tStGrLK AS
    (
      SELECT TO_DATE('01.01.2012', 'DD.MM.YYYY') AS DateLK, 1 AS GrID, 1 AS StID FROM dual UNION ALL
      SELECT TO_DATE('01.01.2012', 'DD.MM.YYYY') AS DateLK, 1 AS GrID, 2 AS StID FROM dual UNION ALL
      SELECT TO_DATE('01.01.2012', 'DD.MM.YYYY') AS DateLK, 1 AS GrID, 3 AS StID FROM dual UNION ALL
      SELECT TO_DATE('01.01.2012', 'DD.MM.YYYY') AS DateLK, 1 AS GrID, 4 AS StID FROM dual UNION ALL
      SELECT TO_DATE('01.01.2012', 'DD.MM.YYYY') AS DateLK, 1 AS GrID, 5 AS StID FROM dual UNION ALL
      SELECT TO_DATE('01.02.2012', 'DD.MM.YYYY') AS DateLK, 2 AS GrID, 2 AS StID FROM dual UNION ALL
      SELECT TO_DATE('10.02.2012', 'DD.MM.YYYY') AS DateLK, 2 AS GrID, 3 AS StID FROM dual UNION ALL
      SELECT TO_DATE('01.03.2012', 'DD.MM.YYYY') AS DateLK, 3 AS GrID, 3 AS StID FROM dual UNION ALL
      SELECT TO_DATE('12.02.2012', 'DD.MM.YYYY') AS DateLK, 3 AS GrID, 2 AS StID FROM dual UNION ALL
      SELECT TO_DATE('05.02.2012', 'DD.MM.YYYY') AS DateLK, 2 AS GrID, 1 AS StID FROM dual
    ),
    tTransactions AS 
    (
      SELECT  1 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID FROM dual UNION ALL
      SELECT  2 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID FROM dual UNION ALL
      SELECT  3 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 3 AS StID FROM dual UNION ALL
      SELECT  4 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 4 AS StID FROM dual UNION ALL
      SELECT  5 AS TrID, TO_DATE('01.01.2012', 'DD.MM.YYYY') AS TrDate, 5 AS StID FROM dual UNION ALL
      SELECT  6 AS TrID, TO_DATE('01.02.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID FROM dual UNION ALL
      SELECT  7 AS TrID, TO_DATE('05.03.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID FROM dual UNION ALL
      SELECT  8 AS TrID, TO_DATE('10.05.2012', 'DD.MM.YYYY') AS TrDate, 1 AS StID FROM dual UNION ALL
      SELECT  9 AS TrID, TO_DATE('10.01.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID FROM dual UNION ALL
      SELECT 10 AS TrID, TO_DATE('15.03.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID FROM dual UNION ALL
      SELECT 11 AS TrID, TO_DATE('01.05.2012', 'DD.MM.YYYY') AS TrDate, 2 AS StID FROM dual
    )
    SELECT
      tTr.TrID,
      tTr.TrDate,
      tSt.StName,
      MAX(tGr.GrName) KEEP (DENSE_RANK LAST ORDER BY tLK.DateLK) AS GrName
    FROM 
      tTransactions tTr
      JOIN tStation tSt ON tSt.StID = tTr.StID
      JOIN tStGrLK  tLK ON tLK.StID = tSt.StID AND tLK.DateLK <= tTr.TrDate
      JOIN tGroups  tGr ON tGr.GrID = tLK.GrID
    GROUP BY
      tTr.TrID,
      tTr.TrDate,
      tSt.StName
    
    13 сен 12, 11:34    [13156425]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Oracle Ответить