Запрос: отобрать уникальные по одному полю

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Запрос: отобрать уникальные по одному полю

Сообщение Leon_ » 29.07.2004 (Чт) 9:58

Задача состоит в том, чтобы отобрать уникальные записи из Tab:
Inv ID Date
1 10 12.03.04
2 23 12.03.04
3 23 12.03.05
4 40 15.03.04
5 25 16.03.05
6 25 16.03.04
Мне надо выбрать из таблицы строки так, чтобы получилось:
1 10 12.03.04
2 23 12.03.04
4 40 15.03.04
5 25 16.03.05
Т.е. отобрать уникальные(?) по полю [ID] записи. Пробовал разные комбинации с DISTINCT или с DISTNCTROW, не получилось. :?
Может, кто подскажет, как это сделать (Access2002)?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 29.07.2004 (Чт) 10:17

А какие именно даты ты хочешь увидеть в выборке? Или тебе все равно? Или они тебе вообще не нужны?

Определись, это довольно важно.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.07.2004 (Чт) 10:24

Даты -- "ORDER BY [Inv]". Т.е. в порядке внесения в базу ([Inv] -- поле типа "счетчик"). Желательно. Принимаю все подсказки!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.07.2004 (Чт) 10:48

select *
from ...
where id in (select distinct id from ...)
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.07.2004 (Чт) 11:08

select *
from ...
where id in (select distinct id from ...)
Это не то :?
В этой задаче это равноценно
Код: Выделить всё
select * from Tab

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.07.2004 (Чт) 11:15

да, не подумал...
я так понял, что для одинаковых ID даты тоже одинаковы?
тогда чуть усложнить:
Код: Выделить всё
select min(Inv)
from Tab
where ID in (select distinct ID from Tab)
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.07.2004 (Чт) 11:27

Нет. Я привел выше пример таблицы. Для одинаковых ID даты могут как одинаковыми, так и разными. Дат на один ID может приходиться 1 или больше. Нужно отобрать такие записи, где не повторяется ID. (OPTIONAL: в порядке возрастания Inv)
"По одной книге каждого автора" :)
(Надеюсь, я понятно объяснил. Как это говорят -- "правильно сформулированная задача дает половину решения" :roll: )

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.07.2004 (Чт) 12:03

Так вот тогда у тебя задание неправильное.
Если для одного ID могут быть разные Date, то какую именно Date выбирать?
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.07.2004 (Чт) 12:40

Любую Date. На самом деле этот пример я позаимствовал, у меня там [DocSale_ID], [Doc_ID], [Purchaser], ... Но ведь для запроса это все неважно, да? 8-)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.07.2004 (Чт) 13:15

Еще как важно.
По условию, надо из нескольких записей вернуть именно одну. И ты должен указать критерий, согласно которому эту одну запись нужно выбирать. Т.е. это будет либо минимальная, либо максимальная, либо первая, либо последняя запись, или любая другая агрегатная функция, возвращающая один результат.

З.Ы. Если тебя интересует только ID, то почему не устаивает select distinct ID from Tab?
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.07.2004 (Чт) 13:43

8) Мне нужно не только ID, а весь кортеж: INV, ID, DATE
Пускай! Мне нужна первая из записей, у которых одинаковый ID
Задача состоит в том, чтобы отобрать уникальные записи из Tab:
Inv ID Date
1 10 12.03.04
2 23 12.03.04
3 23 12.03.05
4 40 15.03.04
5 25 16.03.05
6 25 16.03.04
7 25 16.03.04
Мне надо выбрать из таблицы строки так, чтобы получилось:
1 10 12.03.04
2 23 12.03.04
4 40 15.03.04
5 25 16.03.05
Т.е. отобрать уникальные по полю [ID] записи.

Я понимаю, что задача непростая, иначе не стал бы вам ее предлагать, сам бы сделал. Please! :lol:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 29.07.2004 (Чт) 13:47

Ну, тогда так:
SELECT Inv, ID, MIN(Date)
FROM Tab
GROUP BY Inv, ID

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.07.2004 (Чт) 13:58

Во! :D
Вот это мне нужно. СПАСИБО!
PS: все-таки, VBStreets -- это сила. :D


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 4

    TopList