限制已连接的已排序行数

时间:2016-06-02 03:01:19

标签: sql azure azure-sql-database

我有两个表,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,但我不确定如何排序和限制它。我也试图搜索与此问题相关的资源,但我找不到任何资源。

(我也不确定如何为这个问题说出标题)

1 个答案:

答案 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