Форум: "Прочее";
Текущий архив: 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
Но как узнать, какая запись содержит это минимальное значение? И или хотя бы первую из них, если минимальных для одного UserID несколько. Заранее спасибо.
from Table
group by 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