使用PagedResults进行DISTINCT

时间:2016-11-02 13:11:17

标签: sql sql-server

我相信这会在某处得到解答......

目标:获取DISTINCT DOCURL和其他列

尝试: 1.将SELECT * FROM更改为SELECT DISTINCT DOCURL FROM,仅生成DOCURL列 2.将DISTINCT添加到第二个选择中(根据示例),但我再次获得所有列和行。

注意:代码通常是动态构建的,因此我采用了打印...

SELECT  * 
FROM
(
    Select DISTINCT
        isnull(d.DOCURL,'-') As DOCURL,
        isnull(d.ID,'-') As ID, 
        isnull(d.UPRN,'-') As UPRN,
        isnull(d.VFMDISCIPLINE,'-') As VFMDISCIPLINE,
        isnull(d.VFMDISCIPLINEELEMENT,'-') As VFMDISCIPLINEELEMENT ,
        isnull(d.SurveyDate,' ') As SurveyDate,
        isnull(d.WorkOrder,'-') As WorkOrder,
        ROW_NUMBER() OVER (ORDER BY DOCURL) AS ResultSetRowNumber
    From TblData As D 
    WHERE 1 = 1
        AND d.UPRN = '123XYZ' 
        AND (d.VFMDISCIPLINE = '1'   OR  d.VFMDISCIPLINE = '2'  )
) As PagedResults 
WHERE ResultSetRowNumber > 0 And ResultSetRowNumber <= 20

1 个答案:

答案 0 :(得分:1)

假设DOCURL是一个唯一列,DISTINCT语句的问题是将为子查询中的每一行生成一个新的行号,因此所有行都将被视为不同。您应首先应用distinct,然后获取行号。

编辑:我删除了DISTINCT,因为您的结果集不符合条件。相反,我在子查询中添加了一个分区,这样每个唯一的DOCURL的行号将从1开始,并且它们按ID排序,因为我只是假设你的意思是第一个。外部查询根据子查询的唯一结果重新分配row_numbers。

Select * From (
  SELECT  *, ROW_NUMBER() OVER (ORDER BY DOCURL) AS ResultSetRowNumber 
  FROM
  (
      Select 
          isnull(d.DOCURL,'-') As DOCURL,
          isnull(d.ID,'-') As ID, 
          isnull(d.UPRN,'-') As UPRN,
          isnull(d.VFMDISCIPLINE,'-') As VFMDISCIPLINE,
          isnull(d.VFMDISCIPLINEELEMENT,'-') As VFMDISCIPLINEELEMENT ,
          isnull(d.SurveyDate,' ') As SurveyDate,
          isnull(d.WorkOrder,'-') As WorkOrder,
          ROW_NUMBER() OVER (PARTITION BY d.DOCURL ORDER BY d.ID) As PART
      From TblData As D 
      WHERE 1 = 1
          AND d.UPRN = '123XYZ' 
          AND (d.VFMDISCIPLINE = '1'   OR  d.VFMDISCIPLINE = '2'  )
  ) As t Where PART = 1
) As PagedResults 
WHERE ResultSetRowNumber > 0 And ResultSetRowNumber <= 20