Конференция "Прочее" » Сложности с запросом
 
  • nekepka (03.04.08 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 © (03.04.08 22:16) [1]

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


    О сортироке слышал?
  • nekepka (03.04.08 22:18) [2]

    > О сортироке слышал?
    И о фильтрации, но как это мне поможет?
  • ага (03.04.08 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 © (03.04.08 22:23) [4]

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


    Сортировка не меняет их местами.
    Первая в выборке и есть первая в базе.
  • Johnmen © (03.04.08 22:25) [5]

    > nekepka   (03.04.08 22:13) 

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

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

  • ага (03.04.08 22:32) [7]

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

    см. [5]
  • Prohodil Mimo © (03.04.08 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 © (03.04.08 22:41) [9]
    но мой вариант только для одной записи, если надо для каждого, то без вложенных никак, или ХП.
  • nekepka (03.04.08 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 © (03.04.08 22:46) [11]

    > nekepka   (03.04.08 22:42) [10]

    Как-то так. Только не in, а =
  • nekepka (03.04.08 22:52) [12]

    > Как-то так. Только не in, а =
    Да, только ведь оно "целое", которое Min, поэтому в подселекте может быть и не одна запись, кроме того, буквально на днях, и именно для FireBird, прочитал, что в случае с IN, планы строятся пооптимальнее.
  • Johnmen © (03.04.08 22:55) [13]

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

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

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

    Пооптимальнее чего?
  • ага (03.04.08 23:01) [14]

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

    Нифига себе... Это с какой версии??
  • kaif © (03.04.08 23:01) [15]
    А так нельзя?

    select first 1 min(value), UserID
    from Table
    group by UserID
    order by 1
  • ага (03.04.08 23:03) [16]

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

    Неа. ID еще надо.
  • nekepka (03.04.08 23:08) [17]

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

    Что прочитал, то и озвучил. Может быть зря?
    http://www.interface.ru/fset.asp?Url=/borland/nihvop.htm
  • nekepka (03.04.08 23:11) [18]

    > ага   (03.04.08 23:03) [16]
    Именно ;)
  • Johnmen © (03.04.08 23:12) [19]
    Это не твой случай.
    Впрочем, никто не мешает сравнить реальные планы.
  • ага (03.04.08 23:18) [20]

    > nekepka   (03.04.08 23:08) [17]

    На дату смотрел? 15.07.02
  • ага (03.04.08 23:20) [21]
    Да и FB совсем-совсем не IB. Так что бегом на ibase.ru
  • nekepka (03.04.08 23:20) [22]

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

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

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

    Угу... Счас. Вот как раз большие траблы с IN в FB 1.0 и были. А в статье говорится о IB,
    причем неизвестной версии.
  • ага (03.04.08 23:27) [25]

    > nekepka   (03.04.08 23:24) [23]

    нет ничего плохого во вложенном запросе.
  • nekepka (03.04.08 23:34) [26]

    > нет ничего плохого во вложенном запросе.
    Плохого нет - точно, раз в синтаксисе присутствует, просто думал, может чего не знаю, чего не дочитал, может можно пооптимальнее как-то...
     Большое Спасибо всем отозвавшимся!
  • kaif © (04.04.08 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 © (04.04.08 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

  • ага (04.04.08 15:52) [29]
    select min(value) as min_value, min(ID) as min_id, UserID
     from Table
       group by UserID



    =))
  • Kerk © (04.04.08 16:53) [30]

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

    Скинь плиз контакты в почту или в аську, у тебя анкета слетела
  • Johnmen © (04.04.08 18:48) [31]

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

    Это про что?
  • ага (04.04.08 19:11) [32]

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

    Это про

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

    ...

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


    Самый подходящий вариант - [29]
  • Johnmen © (04.04.08 19:14) [33]

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

    Кхм... Ты серьезно?
  • ага (04.04.08 19:21) [34]

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

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

    > > И или хотя бы первую из них, если минимальных для одного
    > > UserID несколько.
  • Johnmen © (04.04.08 19:40) [35]

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

    Какому такому барабану?
    > значение ID, для которого и было выбрано это минимальное Value.
  • ага (04.04.08 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 © (04.04.08 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 © (04.04.08 20:06) [38]
    пардон, для ID=3 VALUE=77
  • ага (04.04.08 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
    -- ну как-то так.
  • ага (04.04.08 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 © (04.04.08 20:33) [41]

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

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

    PS
    Должен заметить, что это в рамках азов SQL.
  • Johnmen © (04.04.08 20:35) [42]

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

    Ты подгоняешь данные под ответ?
    Забавно...
  • ага (04.04.08 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] и получится.
  • ага (04.04.08 20:48) [44]
    Чет я совсем не понимаю - о чем спор-то?
  • Johnmen © (04.04.08 20:49) [45]

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

    Каким запросом?
 
Конференция "Прочее" » Сложности с запросом
Есть новые Нет новых   [134433   +21][b:0][p:0.002]