2015-02-12 4 views
1

Я хочу, чтобы получить вторые 10 уникальных строк в моей базе данных SQL, для выбора вторых 10 строк, я использую следующий сценарий:получить вторые 10 уникальных строк в SQL

SELECT col1, col2 FROM (
    SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum 
    FROM MyTable 
) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN 10 AND 19 

Но теперь я хочу UNIQUE строки в этом наборе, когда я использую DISTINCT, как в следующем примере, DISTINCT также переместится на RowNum, что делает каждую строку DISTINCT строкой ... как я могу исключить RowNum из моего DISTINCT?

SELECT col1, col2 FROM (
    SELECT DISTINCT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum 
    FROM MyTable 
) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN 10 AND 19 
+0

Используйте 'group by' вместо' distinct'. –

+1

Какие СУБД вы используете? –

+0

@GiorgiNakeuri Microsoft SQL Server, я использую его в среде Azure. – Jeroen

ответ

1

Вы должны использовать group by вместо distinct, а т они применяются в разные моменты выполнения запроса. Конечно, поскольку col1 и col2 находятся в соотношении N: 1 с ID, вам нужно указать SQL, который точно ID использовать при нумерации строк. Вероятно, это может быть MAX(ID). Итак:

SELECT col1, col2 FROM (
    SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY MAX(ID)) AS RowNum 
    FROM MyTable 
    GROUP BY col1, col2 
) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN 10 AND 19 
+0

Спасибо! Это получилось красиво :). – Jeroen

0

Если вы хотите, чтобы отличить эти 10 строк в результате вы можете сделать это в за пределами Select пункта:

SELECT DISTINCT col1, col2 FROM (
    SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum 
    FROM MyTable 
) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN 10 AND 19 

Кроме того, если вы используете SQL Server 2012 вы можете использовать новое сладкое заявление OFFSET FETCH:

SELECT DISTINCT col1, col2 FROM (
     SELECT col1, col2 
     FROM MyTable 
     ORDER BY ID 
     OFFSET 10 ROWS FETCH FIRST 10 ROWS ONLY 
    ) AS MyDerivedTable 
0
SELECT DISTINCT col1, col2 
FROM MyTable 
ORDER BY ID 
LIMIT 10, 19 
+1

LIMIT используется с MySQL ... SQL не поддерживает это (насколько мне известно) – Jeroen

+0

Справедливая точка, спасибо за примечание –

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