Microsoft sql выбирает отдельные определенные столбцы

Я меняю запросы mysql на запросы microsoft sql server 2008, и для применения лимита мне нужно выбрать ROW_NUMBER(), который накапливается по каждой строке, а затем применить условие where WHERE RowNum >= 0 AND RowNum < 0 + 20 для выбора определенного лимита со смещением.

Однако моя проблема заключается в том, что я больше не могу выбирать отдельные, потому что у меня есть столбец RowNum, который отличается для каждой строки, вот мой запрос:

USE mydatabase
GO

WITH Results_CTE
AS (
    SELECT DISTINCT C.firstname
        ,C.lastname
        ,C.id AS clientid
        ,QC.category_name
        ,QR.id
        ,QR.cid
        ,QR.catid
        ,QR.rhid
        ,ROW_NUMBER() OVER (
            ORDER BY QR.id DESC
            ) AS RowNum
    FROM cms_question_report QR
        ,cms_clients C
        ,cms_questioncategory QC
    WHERE C.id = QR.cid
        AND QR.catid = '3'
        AND QR.catid = QC.id
    )
SELECT *
FROM Results_CTE
WHERE RowNum >= 0
    AND RowNum < 0 + 20

И результаты таковы:

╔═══════════╦══════════╦══════════╦═══════════════╦═══════╦═════╦═══════╦══════╦════════╗
║ firstname ║ lastname ║ clientid ║ category_name ║  id   ║ cid ║ catid ║ rhid ║ RowNum ║
╠═══════════╬══════════╬══════════╬═══════════════╬═══════╬═════╬═══════╬══════╬════════╣
║ test      ║ testing  ║      121 ║ Activity Log  ║ 81499 ║ 121 ║     3 ║    0 ║     19 ║
║ test      ║ testing  ║      121 ║ Activity Log  ║ 81498 ║ 121 ║     3 ║    0 ║     20 ║
║ test      ║ testing  ║      121 ║ Activity Log  ║ 81497 ║ 121 ║     3 ║    0 ║     21 ║
║ test      ║ test     ║      120 ║ Activity Log  ║ 81496 ║ 120 ║     3 ║    0 ║     22 ║
║ test      ║ test     ║      120 ║ Activity Log  ║ 81495 ║ 120 ║     3 ║    0 ║     23 ║
║ test      ║ test     ║      120 ║ Activity Log  ║ 81494 ║ 120 ║     3 ║    0 ║     24 ║
║ test      ║ test     ║      120 ║ Activity Log  ║ 81493 ║ 120 ║     3 ║    0 ║     25 ║
╚═══════════╩══════════╩══════════╩═══════════════╩═══════╩═════╩═══════╩══════╩════════╝

Я взял пример из середины результата. То, что мне нужно, например:

╔═══════════╦══════════╦══════════╦═══════════════╦═══════╦═════╦═══════╦══════╦════════╗
║ firstname ║ lastname ║ clientid ║ category_name ║  id   ║ cid ║ catid ║ rhid ║ RowNum ║
╠═══════════╬══════════╬══════════╬═══════════════╬═══════╬═════╬═══════╬══════╬════════╣
║ test      ║ testing  ║      121 ║ Activity Log  ║ 81497 ║ 121 ║     3 ║    0 ║     21 ║
║ test      ║ test     ║      120 ║ Activity Log  ║ 81496 ║ 120 ║     3 ║    0 ║     22 ║
╚═══════════╩══════════╩══════════╩═══════════════╩═══════╩═════╩═══════╩══════╩════════╝

Где я пытаюсь сгруппировать результаты по clientid. Как мне этого добиться?


person SQLDummy    schedule 27.05.2015    source источник
comment
Как вы выбрали значение для RowNum равным 21 и 22 или для id равным 81497 и 81496?   -  person Radu Gheorghiu    schedule 27.05.2015
comment
На самом деле вы можете сделать group by, но проблема, которую я вижу, заключается в том, что идентификатор столбца должен быть уникальным, а не идентификатором клиента, и если есть экземпляры, у которых есть разные catid или rownum, потому что это не очень хорошая идея исключить некоторую информацию только для того, чтобы обобщить таблицы.   -  person yamidemichaos    schedule 27.05.2015
comment
Он начинается с 1 и увеличивается, я выбрал пример из центра результата   -  person SQLDummy    schedule 27.05.2015
comment
@yamidemichaos Я пытался поставить GROUP BY C.id в конце запроса, но получаю сообщение об ошибке: Column 'cms_clients.firstname' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.   -  person SQLDummy    schedule 27.05.2015
comment
@yamidemichaos, и когда я добавляю aggregate_function(C.firstname) в запрос выбора, я получаю еще одну ошибку: 'aggregate_function' is not a recognized built-in function name.   -  person SQLDummy    schedule 27.05.2015
comment
Вы не можете указать aggregate_function(C.firstname) в части запроса SELECT. Ошибка говорит о том, что вы должны добавить GROUP BY C.firstname в конце вашего запроса. Это также справедливо для другого списка столбцов в вашей части SELECT, который вам также необходимо добавить в предложение GROUP BY.   -  person Radu Gheorghiu    schedule 27.05.2015
comment
@RaduGheorghiu Я добавил GROUP BY C.firstname в конце своего запроса, и это дало мне ошибку: Column 'cms_clients.firstname' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.   -  person SQLDummy    schedule 27.05.2015
comment
@RaduGheorghiu Не отказывайся от меня :D   -  person SQLDummy    schedule 27.05.2015
comment
@SQL Но как определить «середину»? Основываясь на какой логике вы выбрали эти две конкретные записи для отображения?   -  person Radu Gheorghiu    schedule 27.05.2015
comment
@RaduGheorghiu Я не создавал сам запрос с нуля, я только преобразовываю его в Microsoft sql и настраиваю его там, однако все извлекаемые поля предварительно просматриваются на главной странице.   -  person SQLDummy    schedule 27.05.2015
comment
@SQL Итак, вы не знаете, что это должно показать? Можете ли вы также опубликовать запрос MySQL? Я думаю, это очень помогло бы.   -  person Radu Gheorghiu    schedule 27.05.2015