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

Вниз

DISTINCT?   Найти похожие ветки 

 
Piter ©   (2004-05-10 00:22) [0]

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


 
jack128 ©   (2004-05-10 00:40) [1]

Если остальные поля - числовые, то можно взять агрегатные функции от этих полей

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


 
Курдль ©   (2004-05-10 01:10) [2]


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

Все зависит от того, как Вы хотели бы потерять подлинные значения остальных полей. Если привести к агрегатным - [1].
А если нет, то по какому принципу выбирать единственную и неповторимую строку?


 
Piter ©   (2004-05-10 02:23) [3]

Вы, наверное, не поняли.

Допустим:

SELECT DISTINCT Field1

вернет только поле Field1 у записей. А мне надо вернуть все поля у записи, но чтобы поле Field1 не повторялось. Аля:

SELECT * DISTINCT Field1


 
Johnmen ©   (2004-05-10 03:09) [4]

СУБД ?


 
Anatoly Podgoretsky ©   (2004-05-10 09:15) [5]

А нету


 
Piter ©   (2004-05-10 13:14) [6]

>Johnmen ©   (10.05.04 03:09) [4]

Firebird


 
Курдль ©   (2004-05-10 13:18) [7]


> вернет только поле Field1 у записей. А мне надо вернуть
> все поля у записи, но чтобы поле Field1 не повторялось.
> Аля:
>
> SELECT * DISTINCT Field1

Это понятно! Но ведь если у Вас 2 записи с одинаковым полем Field1, то какая-то из них будет утеряна. Вы определитесь - какая! Первая? Последняя? Или остальные поля в таких записях будут усреднены (выбраны максимальные и т.п)?


 
sniknik ©   (2004-05-10 13:21) [8]

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

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


 
Курдль ©   (2004-05-10 13:26) [9]


> sniknik ©   (10.05.04 13:21) [8]

Ну Вы бы объяснили человеку, что по выполнению такого запроса будут выбраны первые строки с уникальным Field1, а остальные - потеряны!

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

А сказать "первичный ключ" для Firebird язык не повернулся?


 
sniknik ©   (2004-05-10 13:36) [10]

> Ну Вы бы объяснили человеку, что по выполнению такого запроса будут выбраны первые строки с уникальным Field1, а остальные -
> потеряны!
обьясняли уже, не понял других и неня не поймет. а попробует (если не просто куски п рограмму лепит, а пробует перед этим) сам поймет.

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


 
Курдль ©   (2004-05-10 13:42) [11]


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

Да нет такого понятия "инкремент/декремент". Есть понятие "первичный ключ" и "уникальное поле". Как правило, в 99% случаев в таблице достаточно одного уникального поля - первичного ключа. А для Вашего случая - и подавно!


 
sniknik ©   (2004-05-10 14:33) [12]

> Да нет такого понятия "инкремент/декремент".
словарь Lingvo
increment  (Словари: Общ. лексика англ.; Экономика англ.; Компьютерный англ.)

сущ.

1)

а) возрастание, расширение, увеличение

an increment in salary — увеличение зарплаты

daily increments to our knowledge — ежедневное возрастание наших знаний

Syn:

enlargement, increase 1., augmentation, growth

б) геральдика прибывание (о луне)

The moon is in increment, when her horns point to the dexter. — Луна находится в стадии прибывания, когда на геральдическом поле ее рога указывают влево от зрителя.

2) приращение, прирост, надбавка, прибыль

increment of rent — надбавка к арендной плате

The increment of heat which proves fatal is from 11 deg. to 12 deg. Fahr. above the natural temperature of the animal. — Рост температуры относительно нормы на 11-12 градусов по Фаренгейту является для животного фатальным.

Syn:

increase, growth

3) матем. бесконечно малое приращение; инкремент; дифференциал

MSSQL
incremental values
incrementally updating cubes
incrementally updating dimensions


а Вы что имели ввиду?


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


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

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


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

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


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


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

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


 
sniknik ©   (2004-05-10 15:14) [16]

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


 
Anatoly Podgoretsky ©   (2004-05-10 15:14) [17]

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


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

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


 
Anatoly Podgoretsky ©   (2004-05-10 15:32) [19]

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


 
sniknik ©   (2004-05-10 15:39) [20]

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


 
Anatoly Podgoretsky ©   (2004-05-10 15:46) [21]

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


 
Piter ©   (2004-05-10 15:51) [22]


> Но ведь если у Вас 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
разве не вернет всего одну запись?


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

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

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.

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


 
Lola ©   (2004-05-10 16:11) [24]

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

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


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


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

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

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


 
Vlad ©   (2004-05-10 16:31) [26]

Как вариант:

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


 
sniknik ©   (2004-05-10 16:54) [27]

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

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


 
sniknik ©   (2004-05-10 17:13) [28]

> И вообще:

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


 
Piter ©   (2004-05-10 17:25) [29]

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


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

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

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

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


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


 
Vlad ©   (2004-05-10 17:49) [30]


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

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


 
Erik ©   (2004-05-10 17:50) [31]

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


 
Piter ©   (2004-05-12 19:23) [32]

sniknik ©   (10.05.04 17:13) [28]

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

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

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



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

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

Наверх




Память: 0.56 MB
Время: 0.025 c
3-1083260010
gu_est
2004-04-29 21:33
2004.05.30
Отчет в QReport на основе Select в DBGridEh


8-1079904163
dance
2004-03-22 00:22
2004.05.30
gif


7-1083062572
nv_
2004-04-27 14:42
2004.05.30
Как предотвратить повторные запуски ДОС программ?


3-1084124067
normandia
2004-05-09 21:34
2004.05.30
Перекомпоновать таблицу в SQL запросе


1-1084884672
DimonNew
2004-05-18 16:51
2004.05.30
TreeView