2013-07-31 2 views
1

Учитывая этот набор данных:SQL группа однозначно по типу и положению

ID type_id Position 
1 2  7 
2 1  2 
3 3  5 
4 1  1 
5 3  3 
6 2  4 
7 2  6 
8 3  8 

(Есть только 3 различных возможных type_ids) Я хотел бы, чтобы вернуть набор данных с одной из каждой TYPE_ID в группах, упорядочены по позиции ,

поэтому было бы сгруппировать следующим образом:

Results (ID): [4, 6, 5], [2, 7, 3], [null, 1, 8] 

Таким образом, первая группа будет состоять из каждых из записей type_id с наиболее высокой (относительной) оценкой позиции, вторая группа будет иметь второй высокий балл, третья будет состоять только из двух записей (и нулевой), потому что не существует еще трех типов: type_id

Имеет ли это смысл? И это возможно?

+0

Почему [тег: MySQL] и [tag: postgresql] теги? Смутно, почему я внезапно вижу этот пакет общих Rails и SQL-вопросов, помеченных как MySQL, так и PostgreSQL. –

+0

@CraigRinger хорошо, потому что я использую рельсы на postgres (для герою конечно), но я знаю mysql намного лучше. – goddamnyouryan

ответ

1

что-то подобное:

with CTE as (
    select 
     row_number() over (partition by type_id order by Position) as row_num, 
     * 
    from test 
) 
select array_agg(ID order by type_id) 
from CTE 
group by row_num 

SQL FIDDLE

из, если вы абсолютно необходимо аннулирует в массивах:

with CTE as (
    select 
     row_number() over (partition by type_id order by Position) as row_num, 
     * 
    from test 
) 
select array_agg(c.ID order by t.type_id) 
from (select distinct row_num from CTE) as a 
    cross join (select distinct type_id from test) as t 
    left outer join CTE as c on c.row_num = a.row_num and c.type_id = t.type_id 
group by a.row_num 

SQL FIDDLE

Смежные вопросы