如何选择每组的顶部和底部记录?

ajl*_*ane 1 sql sql-server-2008

比如说,我在数据库中有一个表(SQL Server 2008),其数据与此类似(但更多,更大):

| ID | SCORE | GROUP |
-----------------------
| 10 |     1 | A     |
| 6  |     2 | A     |
| 3  |     3 | A     |
|----|-------|-------|
| 8  |     5 | B     |
|----|-------|-------|
| 4  |     1 | C     |
| 9  |     3 | C     |
| 2  |     4 | C     |
| 7  |     4 | C     |
|----|-------|-------|
| 12 |     3 | D     |
| 1  |     3 | D     |
| 11 |     4 | D     |
| 5  |     6 | D     |
Run Code Online (Sandbox Code Playgroud)

我想得到ID每个记录的顶部和底部记录GROUP,其中每个组的记录按顺序排列SCORE(并补充说明ID),如下所示:

| GROUP | MIN_ID | MAX_ID  |
----------------------------
| A     | 10     | 3       |
| B     | 8      | 8       |
| C     | 4      | 7       |
| D     | 1      | 5       |
Run Code Online (Sandbox Code Playgroud)

问题是:我怎样才能做到这一点?

到目前为止,我一直在尝试基于该RANK()函数的解决方案,但是没有管理查找既产生正确输出又模糊效率或可维护的查询.


笔记:

这个例子很简单.我的'table'实际上是一个已经很复杂的查询的输出,我正在寻找最后阶段.我宁愿只从表中选择一次.

如果可能的话,最好有一个通用的解决方案,允许我选择n每组的顶部和底部值.

IDs为不能方便的顺序.

Qua*_*noi 5

如果可能的话,最好有一个通用的解决方案,允许我选择n每组的顶部和底部值.

WITH q AS
        (
        SELECT  m.*,
                ROW_NUMBER() OVER (PARTITION BY Group ORDER BY Score) AS rn_asc,
                ROW_NUMBER() OVER (PARTITION BY Group ORDER BY Score DESC) AS rn_desc
        FROM    mytable m
        )
SELECT  *
FROM    q
WHERE   rn_asc BETWEEN 1 AND 10
        OR rn_desc BETWEEN 1 AND 10
Run Code Online (Sandbox Code Playgroud)