Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка по истории / 7 сообщений из 7, страница 1 из 1
20.03.2002, 14:54
    #32025852
Michael Hopgarden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по истории
Уважаемые,

не подскажет ли кто более эффективный алгоритм выборки из таблицы истории.
SQL 7.0

set nocount on
create table #t1( -- история
   i int, -- PK
   j int, -- критерий группировки
   k int -- время события
--, l int прочие параметры
)

create table #t2( -- граничные значения
   j int,
   k int
--, constraint unique (j, k)
)

insert #t1 select 1, 1, 1
insert #t1 select 2, 1, 2
insert #t1 select 3, 1, 3
insert #t1 select 4, 2, 1
insert #t1 select 5, 2, 2
insert #t1 select 6, 3, 1

insert #t2 select 1, 3
insert #t2 select 2, 2
insert #t2 select 3, 1

select
   t4.i,
   t4.j,
   t4.k
   from
   (select
      t1.j,
      max(t1.k) as k
      from
      #t1 as t1
      inner join
      #t2 as t2
      on
      t1.j = t2.j
      and
      t1.k < t2.k
   group by t1.j) as t3
   inner join
   #t1 as t4
   on
   t3.j = t4.j
   and
t3.k = t4.k


drop table #t1
drop table #t2
set nocount off

PS
Особенно лестно было бы увидеть ответ знатока оригинальных, в лучшем смысле этого слова, алгоритмов SergSuper`a.
...
Рейтинг: 0 / 0
21.03.2002, 14:46
    #32025921
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по истории
Честно говоря мне лень соображать что же Вы хотите, разбирая Ваш скрипт(обычно хватает 2-х ипостасей одной таблицы для таких задач). Вы бы существенно облегчили мне работу, если бы написали, что же Вам надо.
...
Рейтинг: 0 / 0
22.03.2002, 08:43
    #32025967
Michael Hopgarden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по истории
Например,
история изменеия счета депо (aka #t1)
i, j , k , l
-------------------------------------------
1, счет1-активы1, 1 января, количество-и т.д.
2, счет1-активы1, 2 января, количество-и т.д.
3, счет1-активы1, 5 января, количество-и т.д.
4, счет1-активы2, 2 января, количество-и т.д.
5, счетN-активыM, 8 января, количество-и т.д.

небходимо получить состояние на счетах определенных активов перед определенными датами. Условия задаются таблицей #t2

счет1-активы1, 5 января
счет1-активы1, 5 января
...
Рейтинг: 0 / 0
22.03.2002, 08:47
    #32025969
Michael Hopgarden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по истории
Например,
история изменеия счета депо (aka #t1)
i, j , k , l
-------------------------------------------
1, счет1-активы1, 1 января, количество-и т.д.
2, счет1-активы1, 2 января, количество-и т.д.
3, счет1-активы1, 5 января, количество-и т.д.
4, счет1-активы2, 2 января, количество-и т.д.
5, счетN-активыM, 8 января, количество-и т.д.

небходимо получить состояние на счетах определенных активов перед определенными датами.
Условия задаются таблицей #t2( сочетание j уникальное)
j , k
------------------------
счет1-активы1, перед 5 января
счетN-активыM, перед 10 января
...
Рейтинг: 0 / 0
22.03.2002, 08:57
    #32025972
Michael Hopgarden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по истории
Пардон за недописаные постинги.
На выходе должна быть выборка из #t1
i, j , k , l
-------------------------------------------
2, счет1-активы1, 2 января, количество-и т.д.
5, счетN-активыM, 8 января, количество-и т.д.
[\pre]
...
Рейтинг: 0 / 0
22.03.2002, 09:31
    #32025981
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по истории
При такой структуре отпимально так, как у Вас написано. Я правда делаю еще через одну временную таблицу(не привык писать ...from(select... ), но это не принципиально. Собственно вариантов то и не много.
Но если в таблицу добавить еще одно поле - время следующего изменения - то задача выборки резко упрощается. Правда появляется задача это поле постоянно пересчитывать...


create table #t1( -- история
i int, -- PK
j int, -- критерий группировки
k int, -- время события
k_next int, -- время следующего события
--, l int прочие параметры
)

create table #t2( -- граничные значения
j int,
k int
--, constraint unique (j, k)
)

insert #t1 select 1, 1, 1,2
insert #t1 select 2, 1, 2,3
insert #t1 select 3, 1, 3,1000000
insert #t1 select 4, 2, 1,2
insert #t1 select 5, 2, 2,1000000
insert #t1 select 6, 3, 1,1000000

insert #t2 select 1, 3
insert #t2 select 2, 2
insert #t2 select 3, 1


select t4.i, t4.j, t4.k
from #t1 t4, #t2 t2
where t4.j=t2.j and t4.k<=t2.k and t4.k_next>t2.k
...
Рейтинг: 0 / 0
22.03.2002, 09:39
    #32025985
Michael Hopgarden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по истории
2 SergSuper

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


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