Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DISTINCT?


Страницы:   1 2

Piter ©   (2004-05-10 00:22:00) 

Как можно извлечь все поля, но чтобы поле Some не повторялось?


Piter   (2004-05-12 19:23:00) [1]

sniknik ©   (10.05.04 17:13) [28]

Разобрался... немного не так себе представлял работу GROUP BY

А можно сделать нужный мне запрос без вложенных запросов?

Всем спасибо, извините, что отнял времени. Ну ламер, что поделать...


Erik   (2004-05-10 17:50:00) [2]

Я кажется телеатией овладел! Ну проверим, может тебе так подойдет: Select Some, count(Some) as MyCount name from myTable group by Some, name having MyCount > 1.
Не нихрена непонял, видать телепатию еще развивать надо :(


Vlad   (2004-05-10 17:49:00) [3]


> Piter ©   (10.05.04 17:25) [29]

Так что, [26], [27] не подходит ?


Piter   (2004-05-10 17:25:00) [4]

Варианты:
1. Потерять Vitya  и Vladimir.
2. Потерять Vitya  и Mikle.
3. Потерять Sasha и Vladimir.
4. Потерять Sasha и Mikle


Блин, ну совсем за олуха меня не держите. Я понимаю, что можно потерять. Вот и прошу - приведите примеры запросов, когда теряются одни и примеры запросов, когда теряются другие.

Подходит? но одним Distinct-ом не обойдешься, надо использовать  UNION

В принципе, интересно было бы посмотреть на реализацию запроса.
А так эти пустые поля необязательны, возвращать их не надо.

ты просто не понял (не захотел) см > Курдль ©   (10.05.04 13:18) [7]
а вот теперь видать дошло, вот и появились подробности структуры и уточнения вопроса


sniknik, а ты сегодня в плохом настроении, да?
А то бы ты увидел, что я задавал вопросы ДО поста №7, где Курдль объяснял. ПОСЛЕ этого поста у меня возникли уже другие вопросы, которые я задаю сейчас. Так что не надо наездов. И обсуждать эту тему не надо, дабы не плодить оффтоп.


sniknik   (2004-05-10 17:13:00) [5]

> И вообще:

> SELECT Min(ID) FROM Table1 GROUP BY Field1
> разве не вернет всего одну запись?
одну на каждую группу, т.е. по одной на каждое уникальное значение Field1.


sniknik   (2004-05-10 16:54:00) [6]

>> обьясняли уже, не понял других и неня не поймет
> что-то я не узрел, чтобы мне кто-то объяснил.
ты просто не понял (не захотел) см > Курдль ©   (10.05.04 13:18) [7]
а вот теперь видать дошло, вот и появились подробности структуры и уточнения вопроса.

Vlad ©   (10.05.04 16:31) [26]
> Как вариант:
+ min(name), потеряеш других.


Vlad   (2004-05-10 16:31:00) [7]

Как вариант:

select max(name), telephone from table group by telephone


Курдль   (2004-05-10 16:15:00) [8]


> Встал вопрос - какие записи терять. В данном примере выбрать
> Vitya или Sasha
> и
> Vladimir или Mikle.
>
> Покажите плиз разные варианты...

Варианты:
1. Потерять Vitya  и Vladimir.
2. Потерять Vitya  и Mikle.
3. Потерять Sasha и Vladimir.
4. Потерять Sasha и Mikle.

А самому-то что надо? Если сам не знаешь, то как мы узнаем?
Есть еще вариант - лаконично, но более конкретно описать свою проблему.


Lola   (2004-05-10 16:11:00) [9]

Ты б почитал мой предыдущий пост...
Я тебе предлагаю вариант, в итоге которого получаешь:
Mikle     111111
Vladimir  
Sasha     222222
Vitya    
Alena     333333
Alexey    444444

Подходит? но одним Distinct-ом не обойдешься, надо использовать  UNION.


Piter   (2004-05-10 16:04:00) [10]

Могу еще раз показать на примере. Допустим, есть база:

Name      Telephone
-------------------
Mikle     111111
Sasha     222222
Alena     333333
Vitya     222222
Alexey    444444
Vladimir  111111


Теперь я хочу выбрать уникальные номера телефонов, но если напишу что-то типа:
SELECT DISTINCT Telephone
то получу:

Telephone
---------
111111
222222
333333
444444


То есть, поле Name не будет возвращено. А мне хочется его вернуть также.

Встал вопрос - какие записи терять. В данном примере выбрать Vitya или Sasha
и
Vladimir или Mikle.

Покажите плиз разные варианты...


Piter   (2004-05-10 15:51:00) [11]


> Но ведь если у Вас 2 записи с одинаковым полем Field1, то
> какая-то из них будет утеряна


Ясно... Ну а как реализовать, чтобы была выбрана:

1) Первая
2) Последняя
3) та запись, у которой максимальные значения по другим полям (если поля числовые)?


> обьясняли уже, не понял других и неня не поймет

что-то я не узрел, чтобы мне кто-то объяснил.

select Some, avg(DigitField)
from MyTable
group by Some


А разве такой запрос не вернет одно поле Some у разных записей?
Мне ведь нужно, чтобы и другие поля были возвращены.
К тому же поля не числовые...

SELECT * FROM Table1 WHERE ID IN (SELECT Min(ID) FROM Table1 GROUP BY Field1)

ID должен быть автоинкрементом по синтаксису других баз (с генератором по синтаксису Firebird).


А если у меня нет поля ID? То есть, в базе нет ни одного уникального поля. Вот совокупность двух полей - уникальна.

И вообще:

SELECT Min(ID) FROM Table1 GROUP BY Field1
разве не вернет всего одну запись?


Anatoly Podgoretsky   (2004-05-10 15:46:00) [12]

sniknik ©   (10.05.04 15:39) [20]
Такое иногда нужно в отчетах, а там это решается элементарно, а вод вывод в грид, придется покрутиться, подменяя информацию в буферах или в возвращаемом результате. Количество Some естесвенно может достигать внушительных размеров и при том быть не сортированым, что еще значительнее усложняет задачу, но мы то можем только гадать и каждый по мере своей испорченности.


sniknik   (2004-05-10 15:39:00) [13]

да но если это так > [18] то это так просто (запросом) не решить, или очень навороченным и ограниченным (на количество возможных Some к примеру) или процедурой.


Anatoly Podgoretsky   (2004-05-10 15:32:00) [14]

Lola ©   (10.05.04 15:24) [18]
Может быть, как обычно невнятно объяснено.


Lola   (2004-05-10 15:24:00) [15]

Я конечно дико извиняюсь, что вмешиваюсь в спор титанов, но мне почему-то показалось, что вопрос стоит о том, чтобы значение поля Some выводилось только в первой строке, а в остальных записях, где значение повторяется, выводилось пустое значение. Тогда никакие другие данные не будут потеряны.


Anatoly Podgoretsky   (2004-05-10 15:14:00) [16]

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


sniknik   (2004-05-10 15:14:00) [17]

именно на это запрос завязан, оно должно возрастать, и ему вовсе не обязательно ему быть уникальным, и ключевым, повторения будут дублироватся и все (хотя и не должны по условию если оно инкрементируется, но не смертельно, сразу видно глюк в данных).
p.s. сними шоры с глаз. ID не обязан быть ключем только потому что ты так привык, также не обязан быть уникальным потому что по твоему оно так называется. (прочитай [8] еще раз, там дан тот минимум что необходим по условию, а вот все что ты себе навоображал вот это как раз не имеет значения)


Курдль   (2004-05-10 14:58:00) [18]


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

Да никому не интересно, по какому закону оно меняется (убывает, возрастает, логарифмически, экспоненциально и т.п.) главное, чтобы не повторялось! Это и называется уникальное поле!


sniknik   (2004-05-10 14:54:00) [19]

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


Курдль   (2004-05-10 14:45:00) [20]


> MSSQL
> incremental values
> incrementally updating cubes
> incrementally updating dimensions
>
> а Вы что имели ввиду?

Я имел в виду понятия из теории реляционных баз данных, а Вы?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо