Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Вниз

Сложности с запросом   Найти похожие ветки 

 
nekepka   (2008-04-03 22:13) [0]

Не знаю куда отправить. FireBird, таблица в три поля: ID (Primary Key, автоинкремент на генераторах-тригерах), Value (целое), UserID (целое). Можно ли одним запросом получить минимальное значение Value для каждого UserID, и при этом, в той же записи получить значение ID, для которого и было выбрано это минимальное Value. Без вложенных запросов. Очень нужно.
 Без ID все понятно
select min(value) as min_value, UserID
from Table
group by UserID
 Но как узнать, какая запись содержит это минимальное значение? И или хотя бы первую из них, если минимальных для одного UserID несколько. Заранее спасибо.


 
oldman ©   (2008-04-03 22:16) [1]


> Но как узнать, какая запись содержит это минимальное значение?
>  И или хотя бы первую из них, если минимальных для одного
> UserID несколько.


О сортироке слышал?


 
nekepka   (2008-04-03 22:18) [2]


> О сортироке слышал?
И о фильтрации, но как это мне поможет?


 
ага   (2008-04-03 22:21) [3]


> nekepka   (03.04.08 22:18) [2]

select first (1) bla-bla from bla-bla where bla-bla
order by id desc


 
oldman ©   (2008-04-03 22:23) [4]


> И или хотя бы первую из них, если минимальных для одного
> UserID несколько. Заранее спасибо.


Сортировка не меняет их местами.
Первая в выборке и есть первая в базе.


 
Johnmen ©   (2008-04-03 22:25) [5]


> nekepka   (03.04.08 22:13) 

Без вложенного запроса никак.


 
nekepka   (2008-04-03 22:27) [6]

Да чтож вы на последней части-то сосредоточились.

> Можно ли одним запросом получить минимальное значение Value
> для каждого UserID, и при этом, в той же записи получить
> значение ID, для которого и было выбрано это минимальное
> Value



 
ага   (2008-04-03 22:32) [7]


> nekepka   (03.04.08 22:27) [6]
>
> Да чтож вы на последней части-то сосредоточились.

см. [5]


 
Prohodil Mimo ©   (2008-04-03 22:39) [8]

ага   (03.04.08 22:21) [3]
ему надо минимальное, а не максимальное, и не id, а value

если я правильно понял, то так:

select first 1 value as min_value, UserID, Id
from Table
order by value


 
Prohodil Mimo ©   (2008-04-03 22:41) [9]

но мой вариант только для одной записи, если надо для каждого, то без вложенных никак, или ХП.


 
nekepka   (2008-04-03 22:42) [10]


> Без вложенного запроса никак.

Это, что, как-то так:

select T1.*
from MyTable T1
WHERE
 T1.Value in
   (
   select min(T2.Value)
   from MyTable T2
   where
     T2.UserID = T1.UserID
   )
order by T1.Value


 
Johnmen ©   (2008-04-03 22:46) [11]


> nekepka   (03.04.08 22:42) [10]

Как-то так. Только не in, а =


 
nekepka   (2008-04-03 22:52) [12]


> Как-то так. Только не in, а =
Да, только ведь оно "целое", которое Min, поэтому в подселекте может быть и не одна запись, кроме того, буквально на днях, и именно для FireBird, прочитал, что в случае с IN, планы строятся пооптимальнее.


 
Johnmen ©   (2008-04-03 22:55) [13]


>  поэтому в подселекте может быть и не одна запись,

Да ты что?
:)))

>  и именно для FireBird, прочитал, что в случае с IN, планы
> строятся пооптимальнее.

Пооптимальнее чего?


 
ага   (2008-04-03 23:01) [14]


> в случае с IN, планы строятся пооптимальнее.

Нифига себе... Это с какой версии??


 
kaif ©   (2008-04-03 23:01) [15]

А так нельзя?

select first 1 min(value), UserID
from Table
group by UserID
order by 1


 
ага   (2008-04-03 23:03) [16]


> kaif ©   (03.04.08 23:01) [15]
>
> А так нельзя?

Неа. ID еще надо.


 
nekepka   (2008-04-03 23:08) [17]


> ага   (03.04.08 23:01) [14]

Что прочитал, то и озвучил. Может быть зря?
http://www.interface.ru/fset.asp?Url=/borland/nihvop.htm


 
nekepka   (2008-04-03 23:11) [18]


> ага   (03.04.08 23:03) [16]
Именно ;)


 
Johnmen ©   (2008-04-03 23:12) [19]

Это не твой случай.
Впрочем, никто не мешает сравнить реальные планы.


 
ага   (2008-04-03 23:18) [20]


> nekepka   (03.04.08 23:08) [17]

На дату смотрел? 15.07.02


 
ага   (2008-04-03 23:20) [21]

Да и FB совсем-совсем не IB. Так что бегом на ibase.ru


 
nekepka   (2008-04-03 23:20) [22]


> На дату смотрел?
Ну тогда это ответ на "...с какой версии.." :)))


 
nekepka   (2008-04-03 23:24) [23]


> ага   (03.04.08 23:20) [21]
Да ходил, и не раз... Может плохо ходил... Не будем распыляться: я пока кроме варианта [10] не вижу ничего. Но как удручает вложенный запрос!!!


 
ага   (2008-04-03 23:25) [24]


> nekepka   (03.04.08 23:20) [22]
>
>
> > На дату смотрел?
> Ну тогда это ответ на "...с какой версии.." :)))

Угу... Счас. Вот как раз большие траблы с IN в FB 1.0 и были. А в статье говорится о IB,
причем неизвестной версии.


 
ага   (2008-04-03 23:27) [25]


> nekepka   (03.04.08 23:24) [23]

нет ничего плохого во вложенном запросе.


 
nekepka   (2008-04-03 23:34) [26]


> нет ничего плохого во вложенном запросе.
Плохого нет - точно, раз в синтаксисе присутствует, просто думал, может чего не знаю, чего не дочитал, может можно пооптимальнее как-то...
 Большое Спасибо всем отозвавшимся!


 
kaif ©   (2008-04-04 15:40) [27]

Можно и с помощью запроса SELECT  к хранимой процедуре сделать.
На любом IB заработает.

Надеюсь одному VALUE у юзера соотвествует только один ID. Хотя это заработает в любом случае. По сути это эквивалент вложенного запроса.

CREATE PROCEDURE PROCEDURE1
RETURNS(VALUE INTEGER, USERID INTEGER)
AS
BEBIN
 FOR SELECT MIN(VALUE),USERID
 FROM  TABLE1
 GROUP BY USER_ID
 INTO :VALUE, :USERID
 DO BEGIN
   FOR SELECT ID FROM TABLE1 WHERE USERID=:USERID AND VALUE=:VALUE
   INTO :ID
   DO SUSPEND;
 END
END


 
kaif ©   (2008-04-04 15:41) [28]

Извиняюсь, ID вернуть забыл:

CREATE PROCEDURE PROCEDURE1
RETURNS(ID INTEGER, VALUE INTEGER, USERID INTEGER)
AS
BEBIN
FOR SELECT MIN(VALUE),USERID
FROM  TABLE1
GROUP BY USER_ID
INTO :VALUE, :USERID
DO BEGIN
  FOR SELECT ID FROM TABLE1 WHERE USERID=:USERID AND VALUE=:VALUE
  INTO :ID
  DO SUSPEND;
END
END


 
ага   (2008-04-04 15:52) [29]

select min(value) as min_value, min(ID) as min_id, UserID
 from Table
   group by UserID


=))


 
Kerk ©   (2008-04-04 16:53) [30]


> kaif ©   (04.04.08 15:41) [28]

Скинь плиз контакты в почту или в аську, у тебя анкета слетела


 
Johnmen ©   (2008-04-04 18:48) [31]


> ага   (04.04.08 15:52) [29]

Это про что?


 
ага   (2008-04-04 19:11) [32]


> Johnmen ©   (04.04.08 18:48) [31]
>
>
> > ага   (04.04.08 15:52) [29]
>
> Это про что?
>

Это про

> Можно ли одним запросом получить минимальное значение Value
> для каждого UserID, и при этом, в той же записи получить
> значение ID, для которого и было выбрано это минимальное
> Value.

...

> И или хотя бы первую из них, если минимальных для одного
> UserID несколько.


Самый подходящий вариант - [29]


 
Johnmen ©   (2008-04-04 19:14) [33]


> ага   (04.04.08 19:11) [32]
> Это про
>> Можно ли одним запросом получить минимальное значение Value
>> для каждого UserID, и при этом, в той же записи получить
>> значение ID, для которого и было выбрано это минимальное
>> Value.

Кхм... Ты серьезно?


 
ага   (2008-04-04 19:21) [34]


> Johnmen ©   (04.04.08 19:14) [33]

А что не так? Автору же по барабану, какой именно ид

> > И или хотя бы первую из них, если минимальных для одного
> > UserID несколько.


 
Johnmen ©   (2008-04-04 19:40) [35]


> ага   (04.04.08 19:21) [34]
> А что не так? Автору же по барабану, какой именно ид

Какому такому барабану?
> значение ID, для которого и было выбрано это минимальное Value.


 
ага   (2008-04-04 19:47) [36]


> Johnmen ©   (04.04.08 19:40) [35]

:-)
В таблице 3 поля. Получается, что userid и value попадаются одинаковые, но с разным id.
Если следовать
> > значение ID, для которого и было выбрано это минимальное
> Value.

то мы и выберем все записи с минимальным value но разными id для каждого userid.
Но! Читаем далее:

> > > И или хотя бы первую из них, если минимальных для одного
> > > UserID несколько.
>

Это жжж неспроста :) Так что выбираем min или max id и всех делов.
Ну надо автору поле id в выборке, что поделаешь :-)


 
Johnmen ©   (2008-04-04 20:05) [37]


> ага   (04.04.08 19:47) [36]

Бр-р-р... Какая ерунда...
Рассмотри конкретный пример:
ID VALUE USERID
1  44      3
2  55      4
3  66      5
4  99      5
5  88      5
6  66      5

7  66      6
8  11      8
9  22      9


 
Johnmen ©   (2008-04-04 20:06) [38]

пардон, для ID=3 VALUE=77


 
ага   (2008-04-04 20:16) [39]


> Johnmen ©   (04.04.08 20:05) [37]

Проверял. Днем. Сейчас не на чем :)
Но, следуя логике получим
ID VALUE USERID
1  44      3
2  55      4
6  66      5
7  66      6
8  11      8
9  22      9
-- ну как-то так.


 
ага   (2008-04-04 20:19) [40]

а если оставить как в [37], без уточнения в [38] то
ID VALUE USERID
1  44      3
2  55      4
3  66      5
7  66      6
8  11      8
9  22      9


 
Johnmen ©   (2008-04-04 20:33) [41]


> ага   (04.04.08 20:16) [39]

А и проверять ничего не надо.
Достаточно понимать, что делается в [29].
И это понимание приводит к
...
3 66 5
...

PS
Должен заметить, что это в рамках азов SQL.


 
Johnmen ©   (2008-04-04 20:35) [42]


> ага   (04.04.08 20:19) [40]
> а если оставить

Ты подгоняешь данные под ответ?
Забавно...


 
ага   (2008-04-04 20:46) [43]


> Johnmen ©   (04.04.08 20:35) [42]
>
>
> > ага   (04.04.08 20:19) [40]
> > а если оставить
>
> Ты подгоняешь данные под ответ?

2 варианта - 2 разных ответа. А что, если данные разные, рузультат будет одинаковый??
С какого это перепугу?
К стати,
> Johnmen ©   (04.04.08 20:33) [41]

неверно. Т.к. с данными
ID VALUE USERID
1  44      3
2  55      4
3  77      5
4  99      5
5  88      5
6  66      5
7  66      6
8  11      8
9  22      9
как раз [39] и получится.


 
ага   (2008-04-04 20:48) [44]

Чет я совсем не понимаю - о чем спор-то?


 
Johnmen ©   (2008-04-04 20:49) [45]


> как раз [39] и получится.

Каким запросом?


 
ага   (2008-04-04 20:54) [46]


> Johnmen ©   (04.04.08 20:49) [45]

[29]


 
Johnmen ©   (2008-04-04 21:05) [47]

Ты когда сможешь, попробуй. Чисто для себя.
А сейчас попробуй объяснить, как так min(ID)=6 для USERID=5.


 
ага   (2008-04-04 21:13) [48]


> Johnmen ©   (04.04.08 21:05) [47]
>
> Ты когда сможешь, попробуй. Чисто для себя.
> А сейчас попробуй объяснить, как так min(ID)=6 для USERID=5.
>

Что тут объяснять...

> select min(value) as min_value, min(ID) as min_id, UserID
>  from Table
>    group by UserID


если
ID VALUE USERID
3  77      5
4  99      5
5  88      5
6  66      5
то min(ID)=6 для USERID=5.
если
ID VALUE USERID
3  66      5
4  99      5
5  88      5
6  66      5
то min(ID)=3 для USERID=5.


 
Johnmen ©   (2008-04-04 21:21) [49]

если
ID VALUE USERID
3  77      5
4  99      5
5  88      5
6  66      5
то min(ID)=6 для USERID=5.

Веселая чушь :)
Здесь любая домохозяйка скажет, что min(ID)=3

Короче, учите азы SQL, думайте головой и постите, если хорошо обучены и уверены на все 100.


 
ага   (2008-04-04 22:25) [50]


> Johnmen ©   (04.04.08 21:21) [49]

Проверил таки. Признаю - облажался. В отпуск, пожалуй, пора...


 
nekepka   (2008-04-04 23:33) [51]

Мальчики, не сорьтесь :))) Для ясности вводим обозначения: ID - PK, понятно, Value... ну, скажем время, за которое пробежал стометровку (в мсек, потому и целое), UserID - ИНН бегавшего (от налоговой :).  На ID завязаны другие таблицы, характеризующие этот забег (скорость и направление ветра, состояние, наличие гаишников, и т.п.) Требуется: для каждого ИНН определить его MIN (или МAX, не суть) время убегания, и понять, в каком именно забеге, он этот результат показал.


 
Johnmen ©   (2008-04-04 23:36) [52]


> nekepka   (04.04.08 23:33) [51]

Исчерпывающий однозначный ответ уже дан, ещё на первой странице.


 
Andy BitOff ©   (2008-04-04 23:37) [53]

> Johnmen ©   (04.04.08 23:36) [52]

У меня и Ваш ответ на первой ;)


 
nekepka   (2008-04-04 23:48) [54]

Ну, так и было понятно после первой страницы, что без вложенного запроса - никак. А вы - тУловами... :)


 
Johnmen ©   (2008-04-04 23:49) [55]


> Andy BitOff ©   (04.04.08 23:37) [53]
> У меня и Ваш ответ на первой ;)

Э-э-э... Не понял....


 
nekepka   (2008-04-04 23:52) [56]


>  А вы - тУловами... :)
Но это не умаляет моей признательности за ответы. Еще раз, спасибо!


 
nekepka   (2008-04-04 23:53) [57]


> Э-э-э... Не понял....

Засада готовится... Сначала похвали, а уж потом...


 
kaif ©   (2008-04-05 12:08) [58]

А если он в нескольких забегах показал одно и то же минимальное время, какой из них выводить?

Хотя, честно говоря, если бы я знал, что это к ИНН отношение имеет, я бы вообще не постил в эту ветку ничего...


 
nekepka   (2008-04-06 08:38) [59]


> kaif ©   (05.04.08 12:08) [58]
> А если он в нескольких забегах показал одно и то же минимальное
> время, какой из них выводить?

[1] "или хотя бы первую из них, если минимальных для одного UserID несколько"

> Хотя, честно говоря, если бы я знал, что это к ИНН отношение
> имеет, я бы вообще не постил в эту ветку ничего...

Ну, пусть это будет, "количество строк кода" и "NiсkName" :)) Да разобрались уже. Очередное Спасибо!



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

Форум: "Прочее";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.039 c
8-1180440644
borodaj
2007-05-29 16:10
2008.05.18
попиксельное сравнение изображений


15-1206998230
Германн
2008-04-01 01:17
2008.05.18
Кстати. Поздравляю всех, кто читает мой пост!


2-1208926830
net send
2008-04-23 09:00
2008.05.18
Передать звуковое сообщение


2-1208459997
kalexi
2008-04-17 23:19
2008.05.18
Как вывести изображение из ресурса?


2-1208704632
No_Dead
2008-04-20 19:17
2008.05.18
Банальная оптимизация(или около этого)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский