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
每组的顶部和底部值.
该ID
s为不能方便的顺序.
如果可能的话,最好有一个通用的解决方案,允许我选择
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)