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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.038 c
2-1208420080
operator
2008-04-17 12:14
2008.05.18
TGauge для вывода сколько процентов файла обработано.


15-1207042478
No_Dead
2008-04-01 13:34
2008.05.18
Вопрос о плеере


2-1208339540
DFT
2008-04-16 13:52
2008.05.18
DoMouseWheel


3-1197527318
abhtr
2007-12-13 09:28
2008.05.18
Как восстановить удаленные записи в таблице Firebird


2-1208705054
AlexDan
2008-04-20 19:24
2008.05.18
замедление работы программы