我有两个表,A和B,以及一个连接表M.我想,对于每个A.id,得到表2中值的前两个B.id排序,产生结果下面。它在Azure SQL数据库上运行
Table A Table M Table B
+-----+ +-----+-----+-------+ +-----+
| Id | | AId | BId | Value | | Id |
+-----+ +-----+-----+-------+ +-----+
| 1 | | 1 | 3 | 4 | | 1 |
| 2 | | 1 | 2 | 3 | | 2 |
| 3 | | 3 | 2 | 3 | | 3 |
| 4 | | 3 | 5 | 6 | | 4 |
+-----+ | 3 | 3 | 4 | | 5 |
| 4 | 1 | 2 | +-----+
| 4 | 2 | 1 |
| 4 | 4 | 3 |
+-----+-----+-------+
Result
+-----+-----+-------+
| AId | BId | Value |
+-----+-----+-------+
| 1 | 3 | 4 |
| 1 | 2 | 3 |
| 3 | 5 | 6 |
| 3 | 3 | 4 |
| 4 | 1 | 2 |
| 4 | 4 | 3 |
+-----+-----+-------+
我知道我可以选择所有M.AId行,它们等于1,排序并限制为2,但我需要对表A中的每一行执行此操作。我已经尝试过使用group by,但我不确定如何排序和限制它。我也试图搜索与此问题相关的资源,但我找不到任何资源。
(我也不确定如何为这个问题说出标题)
答案 0 :(得分:1)
您可以使用ROW_NUMBER
:
SELECT
AId, BId, Value
FROM (
SELECT *,
Rn = ROW_NUMBER() OVER(PARTITION BY AId ORDER BY Value DESC)
FROM M
) t
WHERE Rn <= 2