-
Не знаю куда отправить. FireBird, таблица в три поля: ID (Primary Key, автоинкремент на генераторах-тригерах), Value (целое), UserID (целое). Можно ли одним запросом получить минимальное значение Value для каждого UserID, и при этом, в той же записи получить значение ID, для которого и было выбрано это минимальное Value. Без вложенных запросов. Очень нужно. Без ID все понятно select min(value) as min_value, UserID
from Table
group by UserID
Но как узнать, какая запись содержит это минимальное значение? И или хотя бы первую из них, если минимальных для одного UserID несколько. Заранее спасибо.
-
> Но как узнать, какая запись содержит это минимальное значение? > И или хотя бы первую из них, если минимальных для одного > UserID несколько.
О сортироке слышал?
-
> О сортироке слышал? И о фильтрации, но как это мне поможет?
-
> nekepka (03.04.08 22:18) [2]
select first (1) bla-bla from bla-bla where bla-bla order by id desc
-
> И или хотя бы первую из них, если минимальных для одного > UserID несколько. Заранее спасибо.
Сортировка не меняет их местами. Первая в выборке и есть первая в базе.
-
> nekepka (03.04.08 22:13)
Без вложенного запроса никак.
-
Да чтож вы на последней части-то сосредоточились.
> Можно ли одним запросом получить минимальное значение Value > для каждого UserID, и при этом, в той же записи получить > значение ID, для которого и было выбрано это минимальное > Value
-
> nekepka (03.04.08 22:27) [6] > > Да чтож вы на последней части-то сосредоточились.
см. [5]
-
ага (03.04.08 22:21) [3]ему надо минимальное, а не максимальное, и не id, а value если я правильно понял, то так: select first 1 value as min_value, UserID, Id
from Table
order by value
-
но мой вариант только для одной записи, если надо для каждого, то без вложенных никак, или ХП.
-
> Без вложенного запроса никак.
Это, что, как-то так:
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
-
> nekepka (03.04.08 22:42) [10]
Как-то так. Только не in, а =
-
> Как-то так. Только не in, а = Да, только ведь оно "целое", которое Min, поэтому в подселекте может быть и не одна запись, кроме того, буквально на днях, и именно для FireBird, прочитал, что в случае с IN, планы строятся пооптимальнее.
-
> поэтому в подселекте может быть и не одна запись,
Да ты что? :)))
> и именно для FireBird, прочитал, что в случае с IN, планы > строятся пооптимальнее.
Пооптимальнее чего?
-
> в случае с IN, планы строятся пооптимальнее.
Нифига себе... Это с какой версии??
-
А так нельзя?
select first 1 min(value), UserID from Table group by UserID order by 1
-
> kaif © (03.04.08 23:01) [15] > > А так нельзя?
Неа. ID еще надо.
-
-
> ага (03.04.08 23:03) [16] Именно ;)
-
Это не твой случай. Впрочем, никто не мешает сравнить реальные планы.
-
> nekepka (03.04.08 23:08) [17]
На дату смотрел? 15.07.02
-
Да и FB совсем-совсем не IB. Так что бегом на ibase.ru
-
> На дату смотрел? Ну тогда это ответ на "...с какой версии.." :)))
-
> ага (03.04.08 23:20) [21] Да ходил, и не раз... Может плохо ходил... Не будем распыляться: я пока кроме варианта [10] не вижу ничего. Но как удручает вложенный запрос!!!
-
> nekepka (03.04.08 23:20) [22] > > > > На дату смотрел? > Ну тогда это ответ на "...с какой версии.." :)))
Угу... Счас. Вот как раз большие траблы с IN в FB 1.0 и были. А в статье говорится о IB, причем неизвестной версии.
-
> nekepka (03.04.08 23:24) [23]
нет ничего плохого во вложенном запросе.
-
> нет ничего плохого во вложенном запросе. Плохого нет - точно, раз в синтаксисе присутствует, просто думал, может чего не знаю, чего не дочитал, может можно пооптимальнее как-то... Большое Спасибо всем отозвавшимся!
-
Можно и с помощью запроса 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
-
Извиняюсь, 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
-
select min(value) as min_value, min(ID) as min_id, UserID
from Table
group by UserID =))
-
> kaif © (04.04.08 15:41) [28]
Скинь плиз контакты в почту или в аську, у тебя анкета слетела
-
> ага (04.04.08 15:52) [29]
Это про что?
-
> Johnmen © (04.04.08 18:48) [31] > > > > ага (04.04.08 15:52) [29] > > Это про что? >
Это про
> Можно ли одним запросом получить минимальное значение Value > для каждого UserID, и при этом, в той же записи получить > значение ID, для которого и было выбрано это минимальное > Value.
...
> И или хотя бы первую из них, если минимальных для одного > UserID несколько.
Самый подходящий вариант - [29]
-
> ага (04.04.08 19:11) [32] > Это про >> Можно ли одним запросом получить минимальное значение Value >> для каждого UserID, и при этом, в той же записи получить >> значение ID, для которого и было выбрано это минимальное >> Value.
Кхм... Ты серьезно?
-
> Johnmen © (04.04.08 19:14) [33]
А что не так? Автору же по барабану, какой именно ид > > И или хотя бы первую из них, если минимальных для одного > > UserID несколько.
-
> ага (04.04.08 19:21) [34] > А что не так? Автору же по барабану, какой именно ид
Какому такому барабану? > значение ID, для которого и было выбрано это минимальное Value.
-
> Johnmen © (04.04.08 19:40) [35]
:-) В таблице 3 поля. Получается, что userid и value попадаются одинаковые, но с разным id. Если следовать > > значение ID, для которого и было выбрано это минимальное > Value.
то мы и выберем все записи с минимальным value но разными id для каждого userid. Но! Читаем далее:
> > > И или хотя бы первую из них, если минимальных для одного > > > UserID несколько. >
Это жжж неспроста :) Так что выбираем min или max id и всех делов. Ну надо автору поле id в выборке, что поделаешь :-)
-
> ага (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
-
пардон, для ID=3 VALUE=77
-
> 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 -- ну как-то так.
-
а если оставить как в [37], без уточнения в [38] то ID VALUE USERID 1 44 3 2 55 4 3 66 5 7 66 6 8 11 8 9 22 9
-
> ага (04.04.08 20:16) [39]
А и проверять ничего не надо. Достаточно понимать, что делается в [29]. И это понимание приводит к ... 3 66 5 ...
PS Должен заметить, что это в рамках азов SQL.
-
> ага (04.04.08 20:19) [40] > а если оставить
Ты подгоняешь данные под ответ? Забавно...
-
> 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] и получится.
-
Чет я совсем не понимаю - о чем спор-то?
-
> как раз [39] и получится.
Каким запросом?
|