我相信这会在某处得到解答......
目标:获取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
答案 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