如何在分页之前获取不同行的总数?

Posted

技术标签:

【中文标题】如何在分页之前获取不同行的总数?【英文标题】:How can I get the count of total distinct rows before paging? 【发布时间】:2016-06-10 18:30:00 【问题描述】:
SELECT

    someColumnA,
    someColumnB,

FROM someTable

[A COUPLE JOINS HERE]

[A NICE WHERE STATEMENT]

ORDER BY someColumnA DESC

假设这个查询返回 1000 个结果。当我应用 DISTINCT 时,它会压缩为 300。

我想要做的只是使用分页返回 10 个结果来向我的用户预知,我想包括 DISTINCT ROWS 的总数。如果我在选择中添加带有计数的分页,它将返回 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

total = 1000 而不是我想要的 300。有没有一种简单的方法来实现这一点,还是我必须求助于使用子选择来获取所有 300 个不同的行,然后对其进行计数并获取前 10 个?

【问题讨论】:

【参考方案1】:

您可以尝试使用 group by 而不是 distinct

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】:

您可以使用CTE

;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

【讨论】:

以上是关于如何在分页之前获取不同行的总数?的主要内容,如果未能解决你的问题,请参考以下文章

如何引用一个 CTE 两次?

ROWNUM 在分页查询中如何工作?

如何使用 Scrapy FormRequest 在分页的 .asp 站点上模拟下一页链接请求

MySQL高效获取记录总数

如何使用猫鼬和EJS实现分页并在分页时保留搜索查询?

Ext js动态更新分页工具栏的总数