简体   繁体   English

SQL总行数(DENSE_RANK / DISTINCT)

[英]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正确标注他们12 ,和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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM