Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сломал голову на запросе... Помогите, а? / 9 сообщений из 9, страница 1 из 1
02.02.2004, 10:44
    #32394957
sqliner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
Таблица SMENA:
DATA IDMASTER
01.01 5
02.01 5
03.01 6
04.01 6
05.01 7
06.01 7
07.01 7
08.01 5
09.01 5

Надо получить:
DATAN DATAK IDMASTER
01.01 02.01 5
03.01 04.01 6
05.01 07.01 7
08.01 09.01 5

т.е. сгруппировать по непрерывному IDMASTER

Юзаю D5 + IB 6.0
...
Рейтинг: 0 / 0
02.02.2004, 10:46
    #32394964
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
Хранимую процедуру пиши, просто запросом - никак
...
Рейтинг: 0 / 0
02.02.2004, 10:55
    #32394979
sqliner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
Так ить ... и ХП не могу соорудить. Торможу, а кусок послезавтра уже сдавать клиенту надо. Горе мне.
...
Рейтинг: 0 / 0
02.02.2004, 11:11
    #32395023
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
Я не вполне уверен, что такой запрос сработает, поскольку с ФБ не работал ни разу. Синтаксис примерный - просто идея. Ежели паче чаяния не сработеат - обращайтесь, решение найдём.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE TABLE MASTER (DATA DATA NOT NULL PRIMARY KEY,
             IDMASTER INTEGER NOT NULL);

INSERT INTO MASTER VALUES ('01.01.2004', 5 );
INSERT INTO MASTER VALUES ('02.01.2004', 5 );
INSERT INTO MASTER VALUES ('03.01.2004', 6 );
INSERT INTO MASTER VALUES ('04.01.2004', 6 );
INSERT INTO MASTER VALUES ('05.01.2004', 7 );
INSERT INTO MASTER VALUES ('06.01.2004', 7 );
INSERT INTO MASTER VALUES ('07.01.2004', 7 );
INSERT INTO MASTER VALUES ('08.01.2004', 5 );
INSERT INTO MASTER VALUES ('09.01.2004', 5 );

SELECT M1.DATA AS DATAN, 
(SELECT MIN(M3.DATA)
FROM MASTER M3
WHERE NOT EXISTS (SELECT  1  FROM MASTER M4
                            WHERE M4.IDMASTER = M3.IDMASTER AND
                                       M4.DATA = M3.DATA +  1  DAY) AND
          M3.IDMASTER = M1.IDMASTER AND
          M3.DATA >= M1.DATA
) AS DATAK, 
M1.IDMASTER
FROM MASTER M1
WHERE NOT EXISTS (SELECT  1  FROM MASTER M2
                            WHERE M2.IDMASTER = M1.IDMASTER AND
                                       M2.DATA = M1.DATA -  1  DAY)
...
Рейтинг: 0 / 0
02.02.2004, 11:16
    #32395030
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
.....
RETURNS( IDM INTEGER, DATAN TIMESTAMP, DATAK TIMESTAMP)
.....
FOR SELECT ID MASTER FROM SMENA INTO :IDM DO
BEGIN
 SELECT MIN(DATA) FROM SMENA WHERE IDMASTER=:IDM INTO :DATAN;
 SELECT MAX(DATA) FROM SMENA WHERE IDMASTER=:IDM INTO :DATAK;
 SUSPEND;
END
...


Вообще можно и запросом, наверное. Так вот:

Код: plaintext
1.
SELECT IDMASTER, MIN(DATA) AS DATAN, MAX(DATA) AS DATAK FROM SMENA GROUP BY IDMASTER
...
Рейтинг: 0 / 0
02.02.2004, 11:19
    #32395034
Sclif
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
А, извиняй, в условия не внимательно смотрел :)
...
Рейтинг: 0 / 0
02.02.2004, 11:42
    #32395080
sqliner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
> Павел Воронцов.

Спасибо! Ваше решение сработало. Правда, более чем медленно - из таблицы в 336 записей выборка шла 2s 44ms. Но там кругом Plan Natural. Вечерком дома оптимизирую - доложу о результатах.
...
Рейтинг: 0 / 0
02.02.2004, 12:11
    #32395146
Павел Воронцов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
Насчёт оптимизации - подумайте вот в эту сторону
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT MM1.DATA AS DATAN, MIN(MM2.DATA) AS DATAK, MM1.IDMASTER
FROM (SELECT M1.DATA, M1.IDMASTER
FROM MASTER M1 LEFT OUTER JOIN MASTER M2 ON 
M2.IDMASTER = M1.IDMASTER AND M2.DATA = M1.DATA -  1  DAY
WHERE M2.DATA IS NULL) MM1 INNER JOIN (SELECT M1.DATA, M1.IDMASTER
FROM MASTER M1 LEFT OUTER JOIN MASTER M2 ON 
M2.IDMASTER = M1.IDMASTER AND M2.DATA = M1.DATA +  1  DAY
WHERE M2.DATA IS NULL) MM2 ON MM1.IDMASTER = MM2.IDMASTER AND MM2.DATA >= MM1.DATA
GROUP BY MM1.DATA, MM1.IDMASTER
...
Рейтинг: 0 / 0
03.02.2004, 04:55
    #32396032
sqliner
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сломал голову на запросе... Помогите, а?
> Павел Воронцов

1. SELECT FROM (SELECT...) для IB6.0 не конает. Это наверное для FB.

2. Перекомпилировал индексы в таблице MASTER - тормоза были из-за них
Теперь
exec time = 10ms avg fetch time = 2ms на локале
и
exec time = 20ms avg fetch time = 7ms на удаленном сервере,
что меня устраивает на 120%, поэтому

3. СПАСИБО .

Спасибо также всем поучаствовавшим.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сломал голову на запросе... Помогите, а? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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