Конференция "Базы" » top2 по каждому значению условия [D7, MSSQL]
 
  • Sergey2 (03.09.09 15:49) [0]
    можно  выбрать как то только 2 записи (top 2) по каждому значению условия?

    вот такая выборка :

    field1   field2
    1         aa
    1         bb
    1         cc
    2         aaa
    2         bbb
    2         ccc
    2         ddd

    по каждому field1 только первые 2 записи.
    результат вот такой что бы получился

    1 aa
    1 bb
    2 aaa
    2 bbb
    ....

    select top 2 field1, field2
    from mytable
    where field1 = 1
    order by field2
    union
    select top 2 field1, field2
    from mytable
    where field1 = 2
    order by field2
    ....

    вот такой запрос поидее подходит. вот только в таблице 160000 записей.
  • Ega23 © (03.09.09 16:54) [1]
    group by?
  • Sergey2 (03.09.09 17:09) [2]
    по какому полю ?

    select field1
    from mytable
    group by field1

    1
    2
    3
    5
    ....
    160000

    вернет необходимые коды... но по каждому из них необходимо взять из той же таблицы топ 2 полей field2

    что бы получить

    1    aa
    1    bb
    2    aaa
    2    bbb
    3    a1
    3    b1
    5    aa1
    5    bb1
    ....
    160000   aaaa11
    160000   bbbb11

    Как можно это в одном запросе сделать ?
  • stas © (03.09.09 17:31) [3]
    Если MSSQL 2005
    select * from mytable as m outer apply (select top2 * from mytable where mytable.field1=m.field1)
  • stas © (03.09.09 17:33) [4]
    или даже так
    select * from (select distinct field1 from mytable) as m outer apply (select top2 * from mytable where mytable.field1=m.field1)
  • adigozelov © (04.09.09 00:55) [5]
    privet atvet takoy

    stolba "id" zdes Счетчик

    select *  from mytable as  mytable2  where
    id in ( select top 2 id from mytable where field1=mytable2.field1)
  • Sergey2 (04.09.09 09:30) [6]
    stas
    отличный запрос. посмотрел в хелпе - то что нужно. sql вот только 2000 и там такого оператора нет. есть ли нечто подобное в 2000 ?

    хотя идея предложенная adigozelov так же должна отработать. попробую ключевое автоинкрементное поле  добавить в таблицу

    Спасибо за ответы
  • СовестьДМ © (04.09.09 18:45) [7]

    > adigozelov ©   (04.09.09 00:55) [5]

    прежде чем что-то советовать рекомендуется испытывать на себе
  • sniknik © (04.09.09 19:42) [8]
    монстрообразно, но должно сработать и в 2000м ...
    SELECT f1,(SELECT TOP 1 f2 FROM Table1 WHERE a.f1=f1) FROM (SELECT DISTINCT f1 FROM Table1) a
    UNION ALL
    SELECT f1,(SELECT TOP 1 f2 FROM Table1 WHERE a.f1=f1 AND f2<>(SELECT TOP 1 f2 FROM Table1 WHERE a.f1=f1)) FROM (SELECT DISTINCT f1 FROM Table1) a
    ORDER BY f1


    вот за скорость не ручаюсь...
  • adigozelov © (04.09.09 22:29) [9]

    > СовестьДМ

    Slushuy ya paprobul mojut bit v ni paprobili!
  • СовестьДМ © (04.09.09 22:40) [10]

    > adigozelov ©   (04.09.09 22:29) [9]

    ну и как оно?
  • adigozelov © (04.09.09 22:55) [11]

    > СовестьДМ

    Sazdayci table vot takoy

    id +
    field1 int
    field2 varchar(50)

    i zdeliyici insert! a patom zdeliyici moy zapros i vidici shto eta rapotayit!
  • СовестьДМ © (05.09.09 18:17) [12]

    > adigozelov ©   (04.09.09 22:55) [11]

    да вы правы
    я не учел что вхождение делаем по идентификатору

    считаю что запрос adigozelov ©   (04.09.09 00:55) [5] самый простой и БЫСТРЫЙ
  • Sergey2 (08.09.09 15:12) [13]
    adigozelov ©.

    всё верно - ещё раз спасибо за решение. все получилось
 
Конференция "Базы" » top2 по каждому значению условия [D7, MSSQL]
Есть новые Нет новых   [134473   +28][b:0][p:0.001]