2016-06-10 1 views
2
SELECT 

    someColumnA, 
    someColumnB, 

FROM someTable 

[A COUPLE JOINS HERE] 

[A NICE WHERE STATEMENT] 

ORDER BY someColumnA DESC 

Предположим, что этот запрос возвращает 1000 результатов. Когда я применяю DISTINCT, он будет конденсироваться до 300.Как я могу получить подсчет количества отдельных строк перед поиском?

То, что я хочу сделать, - это вернуть только 10 результатов, используя пейджинг, чтобы совершить прелюдию для моих пользователей, и я хочу включить общее количество числа DISTINCT РЯДЫ. Если я добавлю пейджинг с подсчетом в select, он вернет количество строк до DISTINCT.

Вот окончательный запрос я до сих пор

SELECT DISTINCT 

    count(*) OVER() as total, 
    someColumnA, 
    someColumnB, 

FROM someTable 

[A COUPLE JOINS HERE] 

[A NICE WHERE STATEMENT] 

ORDER BY someColumnA DESC 

OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 

всего = 1000, а не 300 я хочу. Есть ли простой способ выполнить это или мне придется прибегнуть к использованию подбора select для извлечения всех 300 различных строк, чтобы затем подсчитать это и получить первые 10?

ответ

2

Вы можете попробовать использовать группу, а отчетливый

SELECT 
    count(*) OVER() as total, 
    someColumnA, 
    someColumnB, 

FROM someTable 

[A COUPLE JOINS HERE] 

[A NICE WHERE STATEMENT] 

GROUP BY someColumnA, someColumnB 
ORDER BY someColumnA DESC 

OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 
2

Вы можете использовать КТР

;WITH CTE_Distinct 
AS 
(
    SELECT DISTINCT 
     someColumnA, 
     someColumnB 
    FROM someTable 
    [A COUPLE JOINS HERE] 
    [A NICE WHERE STATEMENT] 
) 

SELECT 
    count(*) OVER() as total, 
    someColumnA, 
    someColumnB 
FROM CTE_Distinct 
ORDER BY someColumnA DESC 
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY 

Надежда, это поможет вам.

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