Погмогите с запросом!
Есть таблица -
поле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!!?)
Замучился уже. Перепробовал кучу вариантов, последняя надежда на вас.
Есть таблица -
поле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. оба из твоих запросов кривые...
select * from table
where поле2 = (select max(a.поле2) from table a
where a.поле1=table.поле1
group by a.поле1)
а для какой СУБД это тебе надо?
и можно немного поточнее сформулировать задачу?
P.S. оба из твоих запросов кривые...
Firebird (или Interbase, не помню уже)
задача - вытянуть последние(по времени) значения поля1 (если представить что поле1 - фамилии рабочих, а поле2 - время когда они зашли на завод, то задача заключается в том, чтоб узнать когда кто из рабочих в последний раз заходил на завод, то-есть получить таблицу -
поле1 поле2 поле3
Иванов 15:00 грузчик
Петров 15:05 слесарь
Сидоров 15:02 просто_любитель_выпить:-)
Так вот вытянуть кто-пришел позже всех, я могу, это просто, а вот узнать время прихода ВСЕХ рабочих - чета не получается.
(точнее просто время, могу -
select max(поле_со_временем) from table grop by поле_с_фамилией ;
получу столбец со временем, но кроме него нужен еще и столбец с фамилиями и професией!!!)
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)
если считать, что у одного и того же рабочего не может быть двух записей с одним и тем же временим то:
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 (мне же надо по всех рабочих - кто когда пришел)
Нет. Так я получу только одну запись - а именно кто пришел позже всех, и в даном случае это будет слесарь Петров который пришел в 15:05 (мне же надо по всех рабочих - кто когда пришел)
это тебе только кажется :))
ты попробуй запустить, только внимательно посмотри как я это написал...
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)
ты запускал вот так:
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?
а какая разница ? Ведь а это только псевдоним ddat?
разница очень даже большая :)
и это ты поймёш когда получишь другой результат...
(теория дело тонкое)
разница очень даже большая :)
и это ты поймёш когда получишь другой результат...
(теория дело тонкое)
Проверял и в ibexpert и в ibconsole, результат один - выдача последнего кто пришел на работу.
Или у нас сильно разные интербейсы , или ты все-таки меня не так понял, или же просто прикалываешся с новичка :-(((((
правда у меня драга СУБД
но я уверен, что запрос быдет работать
в Access, MS Sql 2000, Oracle 8.x
пришли текст запроса который ты выполнял...
я ещё минут 15 буду на работе...
(icq 94435872)
я не прикалываюсь...
правда у меня драга СУБД
но я уверен, что запрос быдет работать
в 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 тыс. записей - виснет :-(
Замучился уже. Перепробовал кучу вариантов, последняя надежда на вас.
Есть таблица -
поле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