powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Очередной запрос..... Поделитесь мыслями..
29 сообщений из 29, показаны все 2 страниц
Очередной запрос..... Поделитесь мыслями..
    #34295329
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица table1

date | state1 | state2
---------------------------------
31/01/2005 | 1 | 2
31/03/2005 | 2 | 1
31/05/2005 | 2 | 2
31/07/2005 | 3 | 2
31/08/2005 | 1 | 2
31/01/2005 | 3 | 2
31/01/2005 | 1 | 4

данные столбцов state1 и state2 содержаться в таблице table2 и являются в ней ключом...

Мне нужно вытащиться min(date) для каждого ключа из table2.....

В таблице порядка 2-3 млн. записей и она продолжает расти....
Как сделать правильнее?
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295491
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)
Код: plaintext
1.
2.
3.
4.
5.
6.
select *
  from (
         select t.*,
                row_number() over(partition by state1, state2 order by date desc) as rn
           from table1 t
       ) iv
 where rn =  1 ;

2)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select t1.*
  from table1 t1
  join (
         select t0.state1,
                t0.state2,
                max(t0.date) as max_date
           from table1 t0
          group by
                t0.state1,
                t0.state2 
       ) iv
    on iv.max_date = t1.date
   and iv.state1 = t1.state1
   and iv.state2 = t1.state2

3)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select t1.*
  from table1 t1
 where (
         select max(t0.date) 
           from table1 t0
          where t0.state1 = t1.state1
            and t0.state2 = t1.state2
       ) = t1.date
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295500
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев Сергей1)
Код: plaintext
1.
2.
3.
4.
5.
6.
select *
  from (
         select t.*,
                row_number() over(partition by state1, state2 order by date desc) as rn
           from table1 t
       ) iv
 where rn =  1 ;

2)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select t1.*
  from table1 t1
  join (
         select t0.state1,
                t0.state2,
                max(t0.date) as max_date
           from table1 t0
          group by
                t0.state1,
                t0.state2 
       ) iv
    on iv.max_date = t1.date
   and iv.state1 = t1.state1
   and iv.state2 = t1.state2

3)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select t1.*
  from table1 t1
 where (
         select max(t0.date) 
           from table1 t0
          where t0.state1 = t1.state1
            and t0.state2 = t1.state2
       ) = t1.date


Пардон, речь ведь шла о MIN(date):
1)
Код: plaintext
1.
2.
3.
4.
5.
6.
select *
  from (
         select t.*,
                row_number() over(partition by state1, state2 order by date) as rn
           from table1 t
       ) iv
 where rn =  1 ;

2)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select t1.*
  from table1 t1
  join (
         select t0.state1,
                t0.state2,
                min(t0.date) as min_date
           from table1 t0
          group by
                t0.state1,
                t0.state2 
       ) iv
    on iv.min_date = t1.date
   and iv.state1 = t1.state1
   and iv.state2 = t1.state2

3)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select t1.*
  from table1 t1
 where (
         select min(t0.date) 
           from table1 t0
          where t0.state1 = t1.state1
            and t0.state2 = t1.state2
       ) = t1.date
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295688
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select state, min(date) date
from
(
select t2.state, min(t1.date) date
from table2 t2
join table1 t1 on t2.state=t1.state1
group by t2.state
 union all
select t2.state, min(t1.date) date
from table2 t2
join table1 t1 on t2.state=t1.state2
group by t2.state
) a
group by state;
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295747
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Mark....
Это первое, что пришло в голову....Только по быстродействию не проходит....
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295767
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот чего думаю... А нельзя как-нибудь хитро выдернуть из state1 и state2 уникальные значения.... Чтобы один прогон по table1, а в результате уникальный набор....
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295815
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TORTЯ вот чего думаю... А нельзя как-нибудь хитро выдернуть из state1 и state2 уникальные значения.... Чтобы один прогон по table1, а в результате уникальный набор....А можно...
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295848
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как?
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295862
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как?
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295870
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TORTА как?А что в итоге на твоих тестовых данных должно получиться?
TORTЕсть таблица table1

date state1 state231/01/2005 1 231/03/2005 2 131/05/2005 2 231/07/2005 3 231/08/2005 1 231/01/2005 3 231/01/2005 1 4

А то меня запрос от Mark Barinstein-а несколько ввел в ступор.
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295897
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге....

1 | 31/01/2005
2 | 31/01/2005
3 | 31/01/2005
4 | 31/01/2005
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34295948
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попроще:
Код: plaintext
1.
2.
3.
4.
select t2.state, min(t1.date) date
from table1 t1
join table2 t2 on t2.state in (t1.state1, t1.state2)
group by t2.state;
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34296114
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Mark:
Это же почти
select min(date), t2.id
from table1 t1, table2 t2
where t1.state1 = t2.id or t1.state2 = t2.id
group by t2.id
Правильно? У меня получается это самый производительный вариант
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34296137
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTTo Mark:
Это же почти
select min(date), t2.id
from table1 t1, table2 t2
where t1.state1 = t2.id or t1.state2 = t2.id
group by t2.id
Правильно?Да.
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34297172
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может есть еще идеи?
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34297183
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть необходимость использовать результаты этого запроса в более емких запросах.... Может лучше на триггеры и отдельную таблицу? MQT - не проходит, куда еще капнуть?
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34297184
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
копнуть
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34297818
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TORTВ итоге....

1 | 31/01/2005
2 | 31/01/2005
3 | 31/01/2005
4 | 31/01/2005Таки я решал не ту задачу :(
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34302109
a esli tak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTкопнуть

Код: plaintext
1.
2.
3.
with a (date,state) as ( select min(date),state1* 1000 +state2 from table1 group by state1* 1000 +state2 )
select min(date),t2.id from table2 t2,a where t2.id in (a.state-round(a.state,- 1 ),round(a.state,- 1 )/ 1000 ) group by t2.id


kak ideja...
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34305632
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTЕсть необходимость использовать результаты этого запроса в более емких запросах.... Может лучше на триггеры и отдельную таблицу? MQT - не проходит, куда еще капнуть?По-моему , лучше сделать так:
Сделайте
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create table table3 as 
(
select t1.date, t2.id, count(*) cnt
from table1 t1, table2 t2
where t1.state1 = t2.id or t1.state2 = t2.id
group by t2.id, t1.date
) 
data initially deffered refresh immediate;
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34305647
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создайте индекс по id.

А потом делайте
Код: plaintext
1.
2.
3.
select id, min(date)
from table3
group by id;
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34305888
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этакой конструкцией ни разу не пользовался... Это что-то от MQT??? Принцип действия такой же? БД сама будет рулить изменениями?
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34305967
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORTЭто что-то от MQT??? Принцип действия такой же? БД сама будет рулить изменениями?Да.
Ее "минус" в данном случае в том, что с помощью refresh immediate таблиц (т.е. таблиц, где изменения в базовых таблицах отражаются сразу) нельзя использовать min (max) функции.
Но ее в данном случае можно использовать для конструирования таблицы типа
Код: plaintext
id, date
, из которой можно будет брать аггрегаты по id.
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #34382017
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Mark:
Спасибо... В таком виде все получается гораздо оптимистичнее...
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #35075214
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернусь к этой теме... Задача та же, только таблица table1 немного изменилась

date | state1 | state2 |shop_id
---------------------------------
31/01/2005 | 1 | 2 | 1
31/03/2005 | 2 | 1 | 1
31/05/2005 | 2 | 2 | 1
31/07/2005 | 3 | 2 | 2
31/08/2005 | 1 | 2 | 2
31/01/2005 | 3 | 2 | 2
31/01/2005 | 1 | 4 | 3

Соответсвенно постоянно нужны результаты запроса

select min(date), t2.id, t1.shop_id
from table1 t1, table2 t2
where t1.state1 = t2.id or t1.state2 = t2.id
group by t2.id, t1.shop_id
Но такой запрос весьма "тяжелый" по времени...
Пробовал сделать MQT с refresh immediate, как советовал Mark, но тогда идет проседание
на insert into table2.....
Пробовал делать 2 MQT на state1 и state2, а потом вытаскивать минимум из обеих... Производительность также не устроила...
Сейчас тестирую с триггером, который при изменении table1 пишет данные в
table3(shop_id, state, min_date), так теперь лезут блокировки... Дело в том, что при 3 млн. записях в table1, получается в районе 600 тыс!!! записей в table3.... И никакие индексы не помогают....
Что делать-то?:(
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #35124595
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А?
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #35178642
RedDebil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может стоит создать обычную таблицу
вида
id,
min_date
где примари по id
и вот ее уже триггером окучивать
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #35178652
RedDebil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Либо же добавить поле min_id прямо в таблицу table2
...
Рейтинг: 0 / 0
Очередной запрос..... Поделитесь мыслями..
    #35181610
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedDebil, в принципе так и сделал... Только постоянно возникает расширение блокировок... :( А это побороть пока не удается...
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Очередной запрос..... Поделитесь мыслями..
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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