2015-12-30 2 views
1

Я бегу следующий запрос на Postgres:Как использовать row_number() правильно

SELECT a.testscoreid, 
     COUNT(a.*) AS Questions, 
     a.created, 
     ROW_NUMBER() OVER (PARTITION BY Questions) AS Number, 
     b.irt_tlevel 
FROM asmt.testscores a 
    JOIN asmt.questions b ON a.questionid = b.questionid 
WHERE a.answered = TRUE 
AND a.testscoreid = '53bd6ed5da2cfe7baf0d97ed' 
AND irt_tlevel IS NOT NULL 
GROUP BY a.testscoreid, 
     a.created, 
     b.irt_tlevel 
ORDER BY Questions DESC, 
     a.created ASC 

, который дает мне следующий результат:

Testscoreid     Questions Created    Number irt_tlevel 
53bd6ed5da2cfe7baf0d97ed 272  2014-07-09 09:33:25.0 1  easy 
53bd6ed5da2cfe7baf0d97ed 38  2014-07-09 09:33:25.0 1  hard 
53bd6ed5da2cfe7baf0d97ed 34  2014-07-09 09:33:25.0 1  medium 

Я хотел бы иметь приращение Number столбца каждый раз, для всех questionid. Я думаю, что я что-то пропустил в row_number().

Я хочу, чтобы номер столбца увеличивался для всех вопросов. Например, я хотел бы иметь 272 строки (с увеличением числа) для простых вопросов в приведенном выше примере, 38 строк для жестких и 34 строки для среды. В общем, я хотел бы иметь (272 + 38 + 34) строк, с Number приращением в соответствии с Created.

Любые предложения будут оценены.

+2

Я удивлен, что вы можете использовать псевдоним 'Questions' в предложении кадрирования. Это имеет смысл с точки зрения порядка обработки ('row_number()' логически выполняется после 'group by'), но SQL Server и Oracle не поддерживают использование псевдонима в этом контексте. –

+0

Кажется, что на самом деле вы хотите (272 + 38 + 34) строк в своем выходе, почему вы их объединяете? –

ответ

1

Вы хотите показать (272 + 38 + 34) строк? То, что вы ожидаете, непонятно. Если вы хотите такие строки, ваша основная ошибка группируется с уровнем irt_tlevel.

Но если вы сделаете это, чтобы получить общее количество баллов для определенного уровня, вам может потребоваться дополнительный запрос или вызов функции, чтобы получить общее количество.

e.g.- (не тестируется на наличие синтаксических ошибок)

SELECT a.testscoreid,  
     a.created, 
     ROW_NUMBER() OVER (ORDER BY created) AS Number, 
     b.irt_tlevel irt_level 
FROM asmt.testscores a, asmt.questions b 
WHERE a.answered = TRUE 
AND b.questionid = a.questionid 
AND a.testscoreid = '53bd6ed5da2cfe7baf0d97ed' 
ORDER BY a.created ASC 
+0

Сколько строк вы хотите показать? –

+0

Тогда вам не нужен COUNT (a. *) AS Вопросы правильно? потому что это всегда 1. И как должно выглядеть «Number»? –

+0

Правильно, мы можем удалить 'count (*)'. Я просто хочу, чтобы число увеличивалось в соответствии с 'created'. Таким образом, более высокие даты получают больше 'Number' – Patthebug

1

Использование ORDER BY вместо PARTITION BY:

SELECT a.testscoreid, 
     COUNT(*) AS Questions, 
     a.created, 
     ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) AS Number, 
     b.irt_tlevel 
+0

Возможно, я должен был быть более ясным. Я хочу, чтобы столбец 'Number' увеличивался для всех' questionid'. Например, я хотел бы иметь 272 строки (с приращением 'Number') для' easy' вопросов в приведенном выше примере, 38 строк для 'hard' и 34 строки для' medium'. – Patthebug

+0

@Patthebug: в этом случае дублируйте 'order by' в конце запроса, f.e. 'row_number() over (order by Questions DESC, a.created ASC)' – Andomar

+0

@Patthebug: Я думаю, вы не удалили свой раздел 'by by'? – Andomar

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