2015-05-27 3 views
2

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

Мой вопрос, однако, что я больше не могу выбрать различен, так как у меня есть столбец 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. Как мне это достичь?

+0

Как вы выбрали значение для 'RowNum' равным 21 и 22 или' id' как 81497 и 81496? –

+0

На самом деле вы можете делать * group by *, но проблема, которую я вижу, заключается в том, что идентификатор столбца должен быть уникальным, а не идентификатором клиента, и если есть экземпляры, у которых есть разные catid или rownum, так как не рекомендуется удалять некоторую информацию просто обобщить таблицы. – yamidemichaos

+0

Он начинается с 1 и увеличивается, я выбрал пример из центра результата – SQLDummy

ответ

0
USE ctarspla_mercycs 
GO 
WITH Results_CTE AS 
    (SELECT *, ROW_NUMBER() OVER (ORDER BY CLIENTID DESC) AS RowNum 
     FROM (SELECT DISTINCT 
     C.firstname, 
     C.lastname, 
     C.id as clientid, 
     QC.category_name, 
     QR.catid, 
     QR.rhid 
     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) t1) 
SELECT * FROM Results_CTE 
WHERE RowNum >= 0 
AND RowNum < 0 + 20 
Смежные вопросы