Я меняю запросы 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
. Как мне этого добиться?
RowNum
равным 21 и 22 или дляid
равным 81497 и 81496? - person Radu Gheorghiu   schedule 27.05.2015GROUP 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.2015aggregate_function(C.firstname)
в запрос выбора, я получаю еще одну ошибку:'aggregate_function' is not a recognized built-in function name.
- person SQLDummy   schedule 27.05.2015aggregate_function(C.firstname)
в части запроса SELECT. Ошибка говорит о том, что вы должны добавитьGROUP BY C.firstname
в конце вашего запроса. Это также справедливо для другого списка столбцов в вашей частиSELECT
, который вам также необходимо добавить в предложениеGROUP BY
. - person Radu Gheorghiu   schedule 27.05.2015GROUP 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