ROW_NUMBER 和 DISTINCT 的问题

Nei*_*ght 3 sql-server-2008-r2

我有以下查询

SELECT Dept
      ,ID      
  FROM (SELECT TOP (@RowTo) ROW_NUMBER() OVER (ORDER BY Dept) AS ROWID,      
               Dept    
              ,ID
          FROM Department 
         WHERE Dept LIKE @Team + '%') as Calls        
 WHERE RowID >= @RowFrom AND RowID <= @RowTo 
Run Code Online (Sandbox Code Playgroud)

我需要获取DISTINCT部门列表,但需要此查询返回的分页。我曾多次尝试重写这个,但我失败了。有人有任何指示吗?

表数据

ID    Department  Location
1     HR          London
2     HR          Berlin
9     HR          Paris
11    HR          Amsterdam
12    IT          Berlin
13    IT          London
15    HR          New York
18    IT          Paris
19    IT          Barcelona
20    HR          Barcelona
21    Finance     Paris
22    Finance     London
23    Finance     New York
Run Code Online (Sandbox Code Playgroud)

使用以下 SQL:

SELECT Dept
      ,ID      
  FROM (SELECT TOP (@RowTo) ROW_NUMBER() OVER (ORDER BY Dept) AS ROWID,      
               Dept    
              ,ID
          FROM Department 
         WHERE Dept LIKE @Team + '%'
         ORDER
            BY Dept) as Calls        
 WHERE RowID >= @RowFrom AND RowID <= @RowTo 
Run Code Online (Sandbox Code Playgroud)

返回:

Dept    ID
HR      1
HR      2
HR      9
HR      11
IT      12
IT      13
HR      15
IT      18
IT      19
HR      20
Run Code Online (Sandbox Code Playgroud)

现在,我知道我需要删除该ID列才能获得该DISTINCT列的值列表Department。通过这样做,我只会得到:

Dept
HR
IT
Run Code Online (Sandbox Code Playgroud)

没有一个Finance部门被放入结果集中,因为子查询返回了TOP它不属于的10 条记录。这是我不会卡住的地方。

And*_*y M 5

DISTINCT在所有子句的最后或几乎最后评估。因此,它不能在与ROW_NUMBER获得您想要的结果相同的级别上使用。使用派生表与DISTINCT

SELECT
  Dept
FROM (
  SELECT
    Dept,
    ROW_NUMBER() OVER (ORDER BY Dept) AS RowID
  FROM (
    SELECT DISTINCT
      Dept
    FROM Department
    WHERE Dept ... 
  ) AS d
) AS Calls
WHERE RowID ...
;
Run Code Online (Sandbox Code Playgroud)

或替换DISTINCTGROUP BY

SELECT
  Dept
FROM (
  SELECT
    Dept,
    ROW_NUMBER() OVER (ORDER BY Dept) AS RowID
  FROM Department
  WHERE Dept ...
  GROUP BY Dept
) AS Calls
WHERE RowID ...
;
Run Code Online (Sandbox Code Playgroud)