Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Внизтяжелое условие в ХП Найти похожие ветки
← →
GanibalLector © (2004-10-04 23:22) [0]Предположим,имею некую таблицу.Формат примерно следующий:
create table pl(id int,pl1 varchar(8),pl2 varchar(8));
Заполненна примерно так:
1 АА400001 АА400002
2 АА400003 АА400004
3 АБ120001 АБ120002
4 АБ120003 АБ120004
Так вот,необходимо получить
1 АА400001 АА400004
2 АБ120001 АБ120004
Ну,т.е. из всего того,что идет подряд необходимо начальный и конечный.
← →
Fay © (2004-10-04 23:24) [1]Не интересно (мне) это писать. В чём именно проблема? Босс приказал suspend-ить всю выборку?
← →
Zacho © (2004-10-04 23:31) [2]А ещё есть MIN и MAX и до кучи :) FIRST .. SKIP ..
← →
GanibalLector © (2004-10-04 23:39) [3]Не интересно (мне) это писать.
И мне тоже :)
З.Ы. Ладно,я сам...Потом покажу,что получилось.
← →
Fay © (2004-10-04 23:42) [4]2 GanibalLector © (04.10.04 23:39) [3]
Я не выдрючиваюсь - просто устал.
← →
Zacho © (2004-10-04 23:57) [5]А чё показывать-то ?
Вот, например, такой вариант:SELECT * FROM MY_TABLE WHERE
ID=(SELECT MIN(ID) FROM MY_TABLE) OR
ID=(SELECT MAX(ID) FROM MY_TABLE)
Или (в ХП):SELECT FIRST 1 * FROM MY TABLE ORDER BY ID ASC INTO .. ;
SUSPEND;
SELECT FIRST 1 * FROM MY TABLE ORDER BY ID DESC INTO .. ;
SUSPEND;
Можно и ещё что-нибудь придумать ..
Но задача, честно говоря, какая-то странноватая :)
← →
jack128 © (2004-10-05 00:10) [6]Zacho © (04.10.04 23:57) [5]
почему странная. Эта табличка может быть просто для примера, а в реале ID - date. Получить данные за весь период ведения базы(если архив - накопительный)
← →
GanibalLector © (2004-10-05 00:14) [7]2 Zacho ©
спасибо,правда еще не проверял.На форуме завис,как всегда .
А на счет странноватого,так это типа отчет в налоговую :)
Они так хотят.
← →
Zacho © (2004-10-05 00:36) [8]Эээ.. Ещё раз посмотрел твой вопрос, и похоже, я неправильно понял условие задачи. Тогда моё решение не правильно.
Опиши задачу более подробно.
← →
GanibalLector © (2004-10-05 00:42) [9]Опиши задачу более подробно.
Есть таблица пломб,смотреть в [0].Их тысячи.Так вот,необходимо вывести все пломбы.Если они идут подряд то мин-макс.Для примера :
1 АА780001 АА780002
2 АА780015 АА780345
3 АА780346 АА780347
4 АА940000 АА949999
← →
jack128 © (2004-10-05 01:06) [10]GanibalLector © (05.10.04 0:42) [9]
то есть нужно объеденить находящиеся рядом диапазоны пломб?
Напрмер было
1 АА780001 АА780010
2 АА780011 АА780345
стало
АА780001 АА780345
так??
← →
GanibalLector © (2004-10-05 01:14) [11]2 jack128
Да!!!
Кстати,как с тобой связаться???В ICQ тебя нет.
← →
GanibalLector © (2004-10-05 01:16) [12]2 jack128
Только они так
1 АА780001 АА780010
2 АА780011 АА780345
не хранятся.
Они по две в строке.Т.е. :
1 АА780001 АА780002
2 АА780003 АА780004
3 АА780005 АА780006
...
← →
Zacho © (2004-10-05 01:30) [13]1. По какому правилу формируются номера (или что оно там) пломб ? Т.е. всегда 2 буквы и 6-значное число ? Или есть и другие варианты ?
2. Объединять нужно именно диапазоны с одинаковым буквенным префиксом ?
3. Что значит "подряд" ? По ID или по числу в полях pl1, pl2 ?
4. Почему именно такая структура таблицы ? Т.е. почему именно по 2 пломбы в записи ? Может есть смысл (и возможность) изменить структуру ?
Имхо, при такой структуре без "временной" таблицы не обойтись.
← →
GanibalLector © (2004-10-05 01:38) [14]По какому правилу формируются номера (или что оно там) пломб ? Т.е. всегда 2 буквы и 6-значное число ? Или есть и другие варианты ?
да ВСЕГДА 2 буквы и 6 цифр
Объединять нужно именно диапазоны с одинаковым буквенным префиксом ?
Да. Т.е. если
АА999998 АА999999
АБ000001 АБ000002
то обьедениять не так
АА999998-АБ000002
а так
АА999998 АА999999
АБ000001 АБ000002
Что значит "подряд" ? По ID или по числу в полях pl1, pl2 ?
pl1 pl2
Почему именно такая структура таблицы ? Т.е. почему именно по 2 пломбы в записи ? Может есть смысл (и возможность) изменить структуру ?
Это не столь важно.Пусть даже одно поле pl1 и все.На самом деле,структура весьма сложна...я и так упростил.
Имхо, при такой структуре без "временной" таблицы не обойтись.
Естественно.
← →
GanibalLector © (2004-10-05 21:24) [15]Ну,в конце концов получилось следующее
CREATE VIEW PL12(PL,D_OPL)
AS
select pl1,d_opl from opl union select pl2,d_opl from opl;
CREATE PROCEDURE TEST(
ST_DATE DATE,
END_DATE DATE)
RETURNS (
MIN_PL INTEGER,
MAX_PL INTEGER,
OLD_SER VARCHAR(2))
AS
DECLARE VARIABLE N_PL INTEGER;
DECLARE VARIABLE N_SER VARCHAR(2);
DECLARE VARIABLE PRED_PL INTEGER;
DECLARE VARIABLE PRED_SER VARCHAR(2);
begin
select first 1 substring(pl from 3 for 6),substring(pl from 1 for 2) from pl12
where d_opl between :st_date and :end_date order by pl
into :max_pl,:old_ser ; min_pl=max_pl;
select first 1 substring(pl from 3 for 6),substring(pl from 1 for 2) from pl12
where d_opl between :st_date and :end_date order by pl desc into :pred_pl,:pred_ser ;
for select substring(pl from 3 for 6),substring(pl from 1 for 2) from pl12
where d_opl between :st_date and :end_date order by pl into :N_PL,:N_SER do
if (n_ser<>old_ser) then begin
suspend;
old_ser=n_ser;
min_pl=n_pl;
max_pl=n_pl;
end else begin
if ((n_pl=max_pl+1) or (n_pl=max_pl) ) then max_pl=n_pl; else begin
suspend;
min_pl=n_pl;
max_pl=n_pl;
end
end
if (n_pl=pred_pl and n_ser=pred_ser) then suspend;
end
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.049 c