Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Погмогите с запросом!

6.2K
20 января 2004 года
perseptron
6 / / 20.01.2004
Замучился уже. Перепробовал кучу вариантов, последняя надежда на вас.
Есть таблица -
поле1 поле2 другиеполя
1 12:10 ...
2 12:11 ...
3 12:12 ...
... ... ...
... ... ...
1 14:10 ...
2 14:11 ...
3 14:12 ...

нужно вытянуть последние записи всей таблицы для каждого уникального значения поля1 чтоб получилось -
поле1 поле2 другиеполя
1 14:10 ...
2 14:11 ...
3 14:12 ...

вроде как логично правильный запрос типа
select * from table
where поле2 = (select max(поле2) from table
group by поле1)
выдает ошибку - multiple rows in singleton select

Единственный рабочий вариант -
select * from table where поле2 =
(select max(поле2) from table where поле1 = 1)
union
select * from table where поле2 =
(select max(поле2) from table where поле1 = 2)
union
select * from table where поле2 =
(select max (поле3) from table where поле1 = 3)
сыльно медленный так как приходится делать кучу select'oв (а что если в поле1 уникальных значений не 3 а 100!!?)
3.8K
20 января 2004 года
Grey
20 / / 09.06.2003
Цитата:
Originally posted by perseptron
Замучился уже. Перепробовал кучу вариантов, последняя надежда на вас.
Есть таблица -
поле1 поле2 другиеполя
1 12:10 ...
2 12:11 ...
3 12:12 ...
... ... ...
... ... ...
1 14:10 ...
2 14:11 ...
3 14:12 ...

нужно вытянуть последние записи всей таблицы для каждого уникального значения поля1 чтоб получилось -
поле1 поле2 другиеполя
1 14:10 ...
2 14:11 ...
3 14:12 ...

вроде как логично правильный запрос типа
select * from table
where поле2 = (select max(поле2) from table
group by поле1)
выдает ошибку - multiple rows in singleton select

Единственный рабочий вариант -
select * from table where поле2 =
(select max(поле2) from table where поле1 = 1)
union
select * from table where поле2 =
(select max(поле2) from table where поле1 = 2)
union
select * from table where поле2 =
(select max (поле3) from table where поле1 = 3)
сыльно медленный так как приходится делать кучу select'oв (а что если в поле1 уникальных значений не 3 а 100!!?)


а для какой СУБД это тебе надо?
и можно немного поточнее сформулировать задачу?
P.S. оба из твоих запросов кривые...

3.8K
20 января 2004 года
Grey
20 / / 09.06.2003
как вариант попробуй:
select * from table
where поле2 = (select max(a.поле2) from table a
where a.поле1=table.поле1
group by a.поле1)
6.2K
20 января 2004 года
perseptron
6 / / 20.01.2004
Цитата:
Originally posted by Grey

а для какой СУБД это тебе надо?
и можно немного поточнее сформулировать задачу?
P.S. оба из твоих запросов кривые...



Firebird (или Interbase, не помню уже)

задача - вытянуть последние(по времени) значения поля1 (если представить что поле1 - фамилии рабочих, а поле2 - время когда они зашли на завод, то задача заключается в том, чтоб узнать когда кто из рабочих в последний раз заходил на завод, то-есть получить таблицу -

поле1 поле2 поле3
Иванов 15:00 грузчик
Петров 15:05 слесарь
Сидоров 15:02 просто_любитель_выпить:-)

Так вот вытянуть кто-пришел позже всех, я могу, это просто, а вот узнать время прихода ВСЕХ рабочих - чета не получается.
(точнее просто время, могу -
select max(поле_со_временем) from table grop by поле_с_фамилией ;
получу столбец со временем, но кроме него нужен еще и столбец с фамилиями и професией!!!)

3.8K
20 января 2004 года
Grey
20 / / 09.06.2003
если считать, что у одного и того же рабочего не может быть двух записей с одним и тем же временим то:

select * from table
where поле2 = (select max(a.поле2) from table a
where a.поле1=table.поле1)

ну а если это возможно(при совпадении и остальных значений полей), то:

select distinct * from table
where поле2 = (select max(a.поле2) from table a
where a.поле1=table.поле1)
6.2K
20 января 2004 года
perseptron
6 / / 20.01.2004
Цитата:
Originally posted by Grey
если считать, что у одного и того же рабочего не может быть двух записей с одним и тем же временим то:

select * from table
where поле2 = (select max(a.поле2) from table a
where a.поле1=table.поле1)

ну а если это возможно(при совпадении и остальных значений полей), то:

select distinct * from table
where поле2 = (select max(a.поле2) from table a
where a.поле1=table.поле1)



Нет. Так я получу только одну запись - а именно кто пришел позже всех, и в даном случае это будет слесарь Петров который пришел в 15:05 (мне же надо по всех рабочих - кто когда пришел)

3.8K
20 января 2004 года
Grey
20 / / 09.06.2003
Цитата:
Originally posted by perseptron


Нет. Так я получу только одну запись - а именно кто пришел позже всех, и в даном случае это будет слесарь Петров который пришел в 15:05 (мне же надо по всех рабочих - кто когда пришел)



это тебе только кажется :))
ты попробуй запустить, только внимательно посмотри как я это написал...

3.8K
20 января 2004 года
Grey
20 / / 09.06.2003
ты запускал вот так:

select * from DDAT
where SS = (select max(SS) from DDAT where S=S)

а надо вот так:

select * from DDAT
where SS = (select max(a.SS) from DDAT a where a.S=DDAT.S)
6.2K
20 января 2004 года
perseptron
6 / / 20.01.2004
Цитата:
Originally posted by Grey
ты запускал вот так:

select * from DDAT
where SS = (select max(SS) from DDAT where S=S)

а надо вот так:

select * from DDAT
where SS = (select max(a.SS) from DDAT a where a.S=DDAT.S)



а какая разница ? Ведь а это только псевдоним ddat?

3.8K
20 января 2004 года
Grey
20 / / 09.06.2003
Цитата:
Originally posted by perseptron


а какая разница ? Ведь а это только псевдоним ddat?



разница очень даже большая :)
и это ты поймёш когда получишь другой результат...
(теория дело тонкое)

6.2K
20 января 2004 года
perseptron
6 / / 20.01.2004
Цитата:
Originally posted by Grey


разница очень даже большая :)
и это ты поймёш когда получишь другой результат...
(теория дело тонкое)



Проверял и в ibexpert и в ibconsole, результат один - выдача последнего кто пришел на работу.
Или у нас сильно разные интербейсы , или ты все-таки меня не так понял, или же просто прикалываешся с новичка :-(((((

3.8K
20 января 2004 года
Grey
20 / / 09.06.2003
я не прикалываюсь...
правда у меня драга СУБД
но я уверен, что запрос быдет работать
в Access, MS Sql 2000, Oracle 8.x

пришли текст запроса который ты выполнял...
я ещё минут 15 буду на работе...
(icq 94435872)
6.2K
20 января 2004 года
perseptron
6 / / 20.01.2004
Цитата:
Originally posted by Grey
я не прикалываюсь...
правда у меня драга СУБД
но я уверен, что запрос быдет работать
в Access, MS Sql 2000, Oracle 8.x

пришли текст запроса который ты выполнял...
я ещё минут 15 буду на работе...
(icq 94435872)



запрос тот же что ты писал (специально для проверки создал малюсинькую базу)
Видимо проблема в СУБД, так как такой же ответ мне дали на delphimaster.
Еще дали 1 вариант -
SELECT поле1, поле2, поле3
FROM таблица
WHERE поле3 IN (
SELECT MAX(поле3) FROM таблица GROUP BY поле1
)

но он работает только с моей тестовой базой, а в реальной где свыше 500 тыс. записей - виснет :-(

6.1K
28 января 2004 года
PeterV
13 / / 28.01.2004
Цитата:
Originally posted by perseptron
Замучился уже. Перепробовал кучу вариантов, последняя надежда на вас.
Есть таблица -
поле1 поле2 другиеполя
1 12:10 ...
2 12:11 ...
3 12:12 ...
... ... ...
... ... ...
1 14:10 ...
2 14:11 ...
3 14:12 ...

нужно вытянуть последние записи всей таблицы для каждого уникального значения поля1 чтоб получилось -
поле1 поле2 другиеполя
1 14:10 ...
2 14:11 ...
3 14:12 ...

вроде как логично правильный запрос типа
select * from table
where поле2 = (select max(поле2) from table
group by поле1)
выдает ошибку - multiple rows in singleton select

Единственный рабочий вариант -
select * from table where поле2 =
(select max(поле2) from table where поле1 = 1)
union
select * from table where поле2 =
(select max(поле2) from table where поле1 = 2)
union
select * from table where поле2 =
(select max (поле3) from table where поле1 = 3)
сыльно медленный так как приходится делать кучу select'oв (а что если в поле1 уникальных значений не 3 а 100!!?)



Если каждый рабочий только один раз в таблице

SELECT * FROM table1 ORDER BY VREMJA_PRIH

если, они ходят на работу несколько раз в день :)

SELECT RAB_ID, VREMJA_PRIH, ... FROM TABLE1
WHERE VREMJA_PRIH= (SELECT MAX(VREMJA_PRIH FROM TABLE1 T
WHERE RAB_ID=T.RAB_ID)
ORDER BY VREMJA_PRIH

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог