[英]SQL Total Row Count (DENSE_RANK/DISTINCT)
I am selecting records that may contain duplicates, I need to be able to paginate a distinct result set. 我选择的记录可能包含重复项,所以我需要能够对不同的结果集进行分页。
At the moment, I have the following (simplified) query: 目前,我有以下(简化)查询:
SELECT pagiWrapper.* FROM (
SELECT DISTINCT alias.id
, alias.name
, DENSE_RANK() OVER (ORDER BY alias.name ASC) AS 'paginationRowNo'
, COUNT(*) OVER(PARTITION BY 1) AS 'paginationTotalRows'
FROM MyTable alias
LEFT JOIN MyTableTwo alias2 ON alias2.id = alias.id
WHERE ( /* condition */)
) pagiWrapper WHERE pagiWrapper.paginationRowNo > 0 AND pagiWrapper.paginationRowNo <= 15
There are 10 records in this result-set, however DISTINCT
correctly returns 3, and DENSE_RANK
correctly labels them 1
, 2
, and 3
有10个记录在这个结果集,但DISTINCT
正确返回3,和DENSE_RANK
正确标注他们1
, 2
,和3
My problem is paginationTotalRows
still returns 10 (the original duplicates-included) result-set count, how can I modify the query so that paginationTotalRows
returns the correct amount? 我的问题是paginationTotalRows
仍然返回10(包括原始重复项)结果集计数,如何修改查询,以便paginationTotalRows
返回正确的金额?
Try to find MAX(paginationRowNo)
in the top query: 尝试在顶部查询中找到MAX(paginationRowNo)
:
SELECT pagiWrapper.*
FROM(
SELECT *,
MAX(paginationRowNo) OVER(PARTITION BY 1)
as 'paginationTotalRows'
FROM
(
SELECT DISTINCT alias.id
, alias.name
, DENSE_RANK() OVER (ORDER BY alias.name ASC) AS 'paginationRowNo'
FROM MyTable alias
LEFT JOIN MyTableTwo alias2 ON alias2.id = alias.id
WHERE ( /* condition */)
) as PW
) pagiWrapper
WHERE pagiWrapper.paginationRowNo > 0
AND pagiWrapper.paginationRowNo <= 15
Move the windowing function outside the select distinct
. 将开窗功能移至select distinct
different之外。 I would also suggest you use row_number() instead of dense_rank(). 我还建议您使用row_number()而不是density_rank()。
SELECT
pagiWrapper.*
FROM (
SELECT
iq.*
, ROW_NUMBER() OVER (ORDER BY iq.name ASC) AS 'paginationRowNo'
, COUNT(*) OVER (PARTITION BY 1) AS 'paginationTotalRows'
FROM (
SELECT DISTINCT
alias.id
, alias.name
, alias2.something_I_hope
FROM MyTable alias
LEFT JOIN MyTableTwo alias2
ON alias2.id = alias.id
WHERE (1 = 1 /* condition */)
) iq
) pagiWrapper
WHERE pagiWrapper.paginationRowNo > 0
AND pagiWrapper.paginationRowNo <= 15
I recommend ROW_NUMBER()
for pagination. 我建议使用ROW_NUMBER()
进行分页。 This function cannot repeat a number within a partition and, if not partitioned it cannot repeat a number at all. 此功能无法在分区内重复数字,如果未分区,则根本无法重复数字。 DENSE_RANK()
however can repeat a number within any partition and, if not partitioned can still repeat numbers. 但是, DENSE_RANK()
可以在任何分区内重复一个数字,如果没有分区,仍然可以重复一个数字。 For pagination to be utterly predictable you need utterly predictable row numbering, so use ROW_NUMBER()
. 为了使分页完全可预测,您需要完全可预测的行编号,因此请使用ROW_NUMBER()
。 [please] [请]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.