1

我正在选择可能包含重复的记录,我需要能够对不同的结果集进行分页。

目前,我有以下(简化的)查询:

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

此结果集中有 10 条记录,但DISTINCT正确返回 3 条,并DENSE_RANK正确标记它们123

我的问题paginationTotalRows仍然是返回 10 个(包含原始重复项)结果集计数,如何修改查询以paginationTotalRows返回正确的数量?

4

2 回答 2

2

尝试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
于 2014-09-22T08:51:45.793 回答
2

将窗口函数移到select distinct. 我还建议您使用 row_number() 而不是 dense_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

我推荐ROW_NUMBER()分页。这个函数不能在一个分区内重复一个数字,如果没有分区,它根本不能重复一个数字。DENSE_RANK()但是可以在任何分区内重复一个数字,如果没有分区,仍然可以重复数字。要使分页完全可预测,您需要完全可预测的行编号,因此请使用ROW_NUMBER(). [请]

于 2014-09-22T09:10:50.277 回答