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 条记录。这是我不会卡住的地方。
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)
或替换DISTINCT
为GROUP 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)