2014-09-30 5 views
0

У меня есть следующие таблицы, содержащих данные о том, как каждая группа решает проблемы:Переупоряда в пределах группы

PROB | GROUP | REPNO | STATUS 
-----+---------+-------+------- 
1 | Juniors | 0 | 
1 | Seniors | 1 | 
1 | Juniors | 2 | 
1 | Experts | 3 | SOLVED 
2 | Juniors | 0 | 
2 | Seniors | 1 | SOLVED 

Колонок ВЕРЫ определяют проблемы, которые решали группы, группы столбцов определяют, какую группа работает на этом Prob, столбец REPNO определяет количество решающих повторений (повторные попытки до тех пор, пока они не были окончательно решены, 0 означает первую попытку, повторение пока), а конечный столбец STATUS определяет, была ли решена задача в этой конкретной попытке. Здесь я могу рассказать, как работа была эффективно решена в каждом повторении ВСЕМИ ГРУППАМИ (SELECT ... GROUP BY repno).

Но я хочу показать, насколько эффективно решались проблемы с каждой конкретной группой (распределение по собственному порядку повторения каждой группы). Например, PROB 1 дважды тестировался группой Juniors, а один раз группой Seniors и не решался, и, наконец, решался группой экспертов с первой попытки.

Так что мне нужно сделать перерасчет повторений для каждой конкретной группы:

PROB | GROUP | REPNO | REPNO_J | REPNO_S | REPNO_E | STATUS 
-----+---------+-------+---------+---------+---------+------- 
1 | Juniors | 0 |  0 |   |   | 
1 | Seniors | 1 |   |  0 |   |   
1 | Juniors | 2 |  1 |   |   |   
1 | Experts | 3 |   |   |  0 | SOLVED <-- experts solved in first try 
2 | Juniors | 0 |  0 |   |   | 
2 | Seniors | 1 |   |  0 |   | SOLVED <-- seniors solved in first try 

Как сделать этот перерасчет?

+0

Это зафиксировано, что у вас есть ** 3 группы ** или будет номер группы варьируются от случая к случаю? –

+0

Количество групп не меняется. – sbrbot

+0

Являются ли какие-либо из опубликованных ответов приемлемыми для вас или у вас есть что-то еще? –

ответ

1

USE RANK() SQL FIDDLE

select 
    PROB, 
    GROUP1, 
    REPNO, 
    DECODE(GROUP1,'Juniors', rank() over (partition by prob, group1 order by repno) - 1) as REPNO_J, 
    DECODE(GROUP1,'Seniors', rank() over (partition by prob, group1 order by repno) - 1) as REPNO_S, 
    DECODE(GROUP1,'Experts', rank() over (partition by prob, group1 order by repno) - 1) as REPNO_E, 
    STATUS 
from mytable 
order by prob,repno 
+0

Спасибо @Jaugar Chang, это очень элегантное решение. Более того, вы предложили пример в SQLfiddle, вы тот. – sbrbot

0

вы можете использовать саз

SELECT "PROB", 
     "GROUP", 
     "REPNO", 
     (CASE WHEN "GROUP" = 'Juniors' THEN REPNO ELSE NULL END) as REPNO_J, 
     (CASE WHEN "GROUP" = 'Seniors' THEN REPNO ELSE NULL END) as REPNO_S, 
     (CASE WHEN "GROUP" = 'Experts' THEN REPNO ELSE NULL END) as REPNO_E 
FROM Table1 
+0

'CASE' не представляется возможным, если слишком много условий для проверки. Лучше использовать функцию «АНАЛИТИКА», которая выполняет порядок в каждой группе, как указано в разделе «PARTITION BY». –

+0

@LalitKumarB, можете ли вы разработать или дать решение, используя функцию ANALYTIC. – radar

+0

Посмотрите на ответ Торстен. Кроме того, сколько состояний CASE вы бы писали? –

1

Используйте функцию ROW_NUMBER оконной, чтобы получить число в каждую группу:

select 
    prob, 
    "GROUP", 
    repno, 
    case when "GROUP" = 'Juniors' then try end as repno_j, 
    case when "GROUP" = 'Seniors' then try end as repno_s, 
    case when "GROUP" = 'Experts' then try end as repno_e, 
    status 
from 
(
    select 
    prob, "GROUP", repno, status, 
    row_number() over(partition by prob, "GROUP" order by repno) - 1 as try 
    from mytable 
) 
order by prob, repno; 

Кстати: Это не очень хорошая идея Имени столбца GROUP , Это зарезервированное слово в SQL. Таким образом, вы должны использовать кавычки с ним и рассматривать верхний/нижний регистр, когда вы используете имя в запросе.

+0

Гораздо лучшее решение. «АНАЛИТИКА» выполняет порядок в каждой группе, как указано в разделе «PARTITION' BY». –

+0

Это решение работает нормально. @Lalit Kumar B, вы уже дали здесь три комментария, рекомендующих АНАЛИТИКУ, пожалуйста, дайте нам свое решение, а не только комментарии. Мы хотели бы это увидеть. – sbrbot

+0

@sbrbot,> 'Мы хотели бы видеть это. Кто вы все имеете в виду, говоря ** МЫ **? Вы задали вопрос, и люди ответили. То, что я должен был сказать, был технически ответил. Итак, я просто прокомментировал этот ответ своим мнением о том, почему аналитик лучше. Надеюсь, вы получили свой ответ, и мое мнение помогло бы вам понять, почему это лучшее решение. И где вы видели три комментария? На самом деле удивительно видеть тон речи ** вы ** в качестве искателя. –

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