Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.13;
Скачать: CL | DM;

Вниз

Помогите с запросом   Найти похожие ветки 

 
_mandrake_   (2004-01-16 17:58) [0]

Извините если не в тему, но может кто поможет подправит запрос
Есть таблица. В ней 3 поля :


 
_mandrake_   (2004-01-16 18:04) [1]

Удалено модератором


 
_mandrake_   (2004-01-16 19:31) [2]

ну что никто не поможет ?


 
Семен Сорокин ©   (2004-01-16 19:42) [3]

SELECT поле1, поле2, поле3
FROM таблица
WHERE поле3 IN (
SELECT MAX(поле3) FROM таблица GROUP BY поле1
)
ORDER BY поле1


 
Johnmen ©   (2004-01-17 01:08) [4]

>Семен Сорокин © (16.01.04 19:42)

Не, не так !

>_mandrake_


SELECT T1.F1, T1.F2, T1.F_TIME
FROM Table T1
WHERE T1.F_TIME=(SELECT MAX(T2.F_TIME)
FROM Table T2
WHERE T1.F1=T2.F1)


 
_mandrake_   (2004-01-20 16:57) [5]


> Johnmen © (17.01.04 01:08) [4]
> >Семен Сорокин © (16.01.04 19:42)
>
> Не, не так !

как раз так ! (правда при работе с БАЛЬШИМИ базами падает сервер :-((((


> SELECT T1.F1, T1.F2, T1.F_TIME
> FROM Table T1
> WHERE T1.F_TIME=(SELECT MAX(T2.F_TIME)
> FROM Table T2
> WHERE T1.F1=T2.F1)

этот запрос выдает только 1 запись - с максимальным временем, а мне надо для каждого уникального значения поля1 - свое максимальное значение поля3


 
Johnmen ©   (2004-01-20 17:04) [6]

>_mandrake_ (20.01.04 16:57)
>этот запрос выдает только 1 запись

А ты проверил ?


 
_mandrake_   (2004-01-20 17:12) [7]

Еще вопрос - есть ли в sql функция чтоб вынуть с базы последние N записей? ( и чтоб в interbase работала, или я многого хочу? ;-)


 
_mandrake_   (2004-01-20 17:18) [8]


> Johnmen © (20.01.04 17:04) [6]
> >_mandrake_ (20.01.04 16:57)
> >этот запрос выдает только 1 запись
>
> А ты проверил ?


Да проверил.
(На forum.codenet.ru мне дали такой же ответ, я долго старался доказать что это не работает, а потом выяснилось что запрос заточен под Access, MS Sql 2000, Oracle 8.x Кстати а у тебя что за субд?)


 
Johnmen ©   (2004-01-20 17:20) [9]

>_mandrake_

А где опровержение [4] ???? Или ты просто голословен ?

>_mandrake_ (20.01.04 17:12)

Нет.


 
Johnmen ©   (2004-01-20 17:21) [10]

>_mandrake_ (20.01.04 17:18)

Плохо проверял.
"Запрос идеально работает." (c) IB и клоны
:)


 
_mandrake_   (2004-01-20 17:43) [11]

Специально создал базу -
SET SQL DIALECT 3;

SET NAMES NONE;

CREATE DATABASE "C:\Bases\TEST.GDB"
USER "SYSDBA" PASSWORD "masterkey"
PAGE_SIZE 1024
DEFAULT CHARACTER SET NONE;

CREATE TABLE "testova" (
PROFFESION CHAR(10),
INTIME TIMESTAMP,
SURNAME CHAR(10));


заполнил поля
surname profession intime
Иванов сварщик 19.01.04 08:00
Петров слесарь 19.01.04 08:05
Сидоров грузчик 19.01.04 08:02
Иванов сварщик 20.01.04 08:10
Петров слесарь 20.01.04 08:01
Сидоров грузчик 20.01.04 08:06

и в результате твоего запроса получил -
Иванов сварщик 20.01.04 08:10

в результате запроса Семена Сорокина -
Иванов сварщик 20.01.04 08:10
Петров слесарь 20.01.04 08:01
Сидоров грузчик 20.01.04 08:06

Как можна лучше проверить?


 
Johnmen ©   (2004-01-20 18:05) [12]

>_mandrake_ (20.01.04 17:43)
>...и в результате твоего запроса получил - ...

Наглая ложь !!!
:)


 
_mandrake_   (2004-01-20 18:11) [13]


> >_mandrake_ (20.01.04 17:43)
> >...и в результате твоего запроса получил - ...
>
> Наглая ложь !!!
> :)

блин, зачем мне врать? Не знаю я почему так, но это ТАК!!!


 
Johnmen ©   (2004-01-20 18:15) [14]

Приведи ПОЛНОСТЬ запрос, который выполнял с тестовой таблицей. И не говори, что он мой :)


 
_mandrake_   (2004-01-20 18:22) [15]

SELECT *
FROM "testova"
WHERE intime=(SELECT MAX(T2.intime)
FROM "testova" T2
WHERE surname=T2.surname)


 
Johnmen ©   (2004-01-20 18:25) [16]

А теперь найди одно отличие ! Сущностное. От запроса, который я приводил.


 
_mandrake_   (2004-01-20 18:29) [17]

Извини, никогда бы не подумал что это может иметь значение. (но почему псевдонимы могут влиять на запрос?)


 
Johnmen ©   (2004-01-20 18:33) [18]

>_mandrake_ (20.01.04 18:29)

Дело в том, что во вложенном запросе для surname ты не указал псевдоним. А значит считается, что это поле относится к запросу, для которого упомянуто, FROM "testova" T2.
Т.е. T2.surname=T2.surname.

Кстати, посмотри ещё на скорость выполнения...


 
_mandrake_   (2004-01-20 18:35) [19]

Ха, рано я обрадовалси... Это работает только с тестовой базой, с моей реальной базой где приблизительно 500тыс записей - висяк, как и в случае запроса Семена Сорокина. Но почему? Результат запроса (для моей БАЛЬШОЙ базы) типа -
select max(intime) from testova group by surname
выводится за секунд 20???


 
Семен Сорокин ©   (2004-01-20 18:55) [20]

_mandrake_ (20.01.04 18:35) [19]
надеюсь про индексы мы помним?


 
_mandrake_   (2004-01-20 19:06) [21]

Да сделал индекс по полю со временем. Может еще че-нить заиндексить?


 
Семен Сорокин ©   (2004-01-20 19:13) [22]

_mandrake_ (20.01.04 19:06) [21]
Да сделал индекс по полю со временем. Может еще че-нить заиндексить?


смотри сам, слишком много индексов - тоже нехорошо.
для твоего случая можно еще и для поля1(integer).
Ага и сообщи потом сколько запрос выполняется. :)


 
_mandrake_   (2004-01-20 19:30) [23]

Индекс по полю почти ничего не дал - все те же 20 сек. (Эапрос -
select max(поле_со_временем)from таблица group by поле1 ; )
Как я понимаю в записаном выше запросе делается почти вся работа, почему же виснет -
select * from таблица
where поле_со_временем IN (select max(поле_со_временем)from таблица group by поле1)

Ведь всегото и делов чтоб выбрать все поля с найденых уже записей.


 
Johnmen ©   (2004-01-20 21:33) [24]

>_mandrake_

Для ускорения приведенного мною запроса сделай индекс на поле_со_временем и поле, по которому "соединяем".
По поводу запроса Семен Сорокин © (16.01.04 19:42) [3]:
Запрос "тяжелый" из-за группировки и из-за IN.
К тому же будет работать некорректно, если вдруг максимум значения датавремя для к.-л. человека совпадет с немаксимумом для другого...


 
Krey   (2004-01-20 22:02) [25]

Ваши запросы выполнялись долго (на большой таблице) потому, что вы поставили в условие where в подзапрос.
т.е здесь скорость выполнения зависит от оптимизатора запросов вашей СУБД.

Предлагаю след. запрос:

Select a.field1,a.field2,a.field3
from table1 a,(Select max(field3) as max from table1 group by field1) b
where a.field3 = b.max

В этом запросе СУБД сделает два отдельных запроса и объединит их Inner join"ом
В вашем же случае СУБД без оптимизатора делала бы по одному подзапросу MAX()
для каждой записи из table1

Извините если где ошибка (писал на коленях и проверить некогда) но думаю смасл понятен.
Ответить скорее всего не смогу.


 
Krey   (2004-01-20 22:12) [26]

Ой извините. У вас там InterBase.
Не знаю понимает она подзапросы в условии From.
В MSSQL, MSJET и FoxPro 9 выполнился бы.


 
_mandrake_   (2004-01-21 09:31) [27]


> Johnmen © (20.01.04 21:33) [24]
> >_mandrake_
>
> Для ускорения приведенного мною запроса сделай индекс на
> поле_со_временем и поле, по которому "соединяем".
> По поводу запроса Семен Сорокин © (16.01.04 19:42) [3]:
> Запрос "тяжелый" из-за группировки и из-за IN.
> К тому же будет работать некорректно, если вдруг максимум
> значения датавремя для к.-л. человека совпадет с немаксимумом
> для другого...


Индексы сделаны, но реэультата это не дало, так как виснут оба запроса - и Семена Сорокина и твой. (под зависанием я понимаю безрезультатное :-) ожидание результата больше 20 мин. )

P.S. Чета мне все меньше нравится InterBase...


 
Johnmen ©   (2004-01-21 09:36) [28]

>_mandrake_ (21.01.04 09:31) [27]

Причем тут IB ??? Попробуй на другом SQL сервере. Результат будет тот же.
Если нужно выжать максимальную скорость - пиши ХП.



Страницы: 1 вся ветка

Текущий архив: 2004.02.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.029 c
7-39103
Artem03
2003-11-28 14:49
2004.02.13
Занят (открыт) файл (txt, xls и пр.) или нет.


14-39077
тихий вовочка
2004-01-24 08:12
2004.02.13
Drag and drop


14-39082
mrald
2004-01-24 01:34
2004.02.13
Скажите, есть ли


14-39002
chtr
2004-01-22 07:34
2004.02.13
Иконку для D7


7-39104
pavel_guzhanov
2003-11-27 16:06
2004.02.13
использование WinIO