Sql server SQL Server:如何根据组列的值选择组的顶行?

Sql server SQL Server:如何根据组列的值选择组的顶行?,sql-server,Sql Server,我有两张像下面这样的桌子 表1 表2 编辑: 我要做的是选择表2中id为1的前2行作为id为1的rem值为2,选择id为2的前1行作为rem值为1,依此类推。我使用的是MS sqlserver 2012,我的整个场景比这更复杂。请帮忙。 非常感谢。 编辑:我知道我应该给出我所做的和我是如何做的,但对于这一部分,我没有开始的想法。我可以通过对每个唯一id使用while循环来实现这一点,但如果可能的话,我希望一次完成。首先,SQL表表示无序集。除非包含order by,否则没有关于获得哪些值的说明

我有两张像下面这样的桌子

表1 表2 编辑:

我要做的是选择表2中id为1的前2行作为id为1的rem值为2,选择id为2的前1行作为rem值为1,依此类推。我使用的是MS sqlserver 2012,我的整个场景比这更复杂。请帮忙。 非常感谢。
编辑:我知道我应该给出我所做的和我是如何做的,但对于这一部分,我没有开始的想法。我可以通过对每个唯一id使用while循环来实现这一点,但如果可能的话,我希望一次完成。

首先,SQL表表示无序集。除非包含order by,否则没有关于获得哪些值的说明

为此,我将使用row_编号:

注意:windows子句中的ORDERBY id应基于所需的行。如果您不关心哪一行,则按id排序或按选择空排序都可以。

尝试以下操作:

DECLARE @tbl1 TABLE (id INT, rem INT)
INSERT INTO @tbl1 VALUES (1,   2), (2,   1)

DECLARE @tbl2 TABLE (id INT, value VARCHAR(10))
INSERT INTO @tbl2 VALUES  (1,   'abc'), (1,   'xyz'),
(1,   'mno'), (2,   'mnk'), (2,   'mjd')

SELECT * FROM @tbl1 -- your table 1
SELECT * FROM @tbl2 -- your table 2

SELECT id,value,rem FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY T.ID ORDER BY T.ID) rowid,
T.id,T.value,F.rem FROM  @tbl2 T LEFT JOIN @tbl1 F ON T.id = F.id ) A WHERE rowid = 1 
-- your required output

希望有帮助。

不是免费的代码编写服务。您应该尝试自己编写代码。之后,如果你有问题,你可以张贴你已经尝试了一个明确的解释什么是不工作,并提供一个解决方案。我建议你读一个好的问题和答案。另外,请务必使用。您尝试了什么,具体哪部分有问题?我正在编写存储过程,它的业务非常庞大。我无法解释这里所有的事情。我问的问题是我问题的简化版本。如果我能得到帮助,那将是很大的帮助。我来这里不是没有任何调查的。谢谢你的快速回复。在我将其用于存储过程并从您的查询中输出后,我会尽快通知您:id值rem 1 abc 2 mnk 1
id value
1   abc
1   xyz
1   mno
2   mnk
2   mjd
#output
id value
1  abc
1  xyz
2  mnk
select t2.*
from table1 t1 join
     (select t2.*,
             row_number() over (partition by id order by id) as seqnum
      from table2 t2
     ) t2
     on t1.id = t2.id and t2.seqnum <= t1.rem;
DECLARE @tbl1 TABLE (id INT, rem INT)
INSERT INTO @tbl1 VALUES (1,   2), (2,   1)

DECLARE @tbl2 TABLE (id INT, value VARCHAR(10))
INSERT INTO @tbl2 VALUES  (1,   'abc'), (1,   'xyz'),
(1,   'mno'), (2,   'mnk'), (2,   'mjd')

SELECT * FROM @tbl1 -- your table 1
SELECT * FROM @tbl2 -- your table 2

SELECT id,value,rem FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY T.ID ORDER BY T.ID) rowid,
T.id,T.value,F.rem FROM  @tbl2 T LEFT JOIN @tbl1 F ON T.id = F.id ) A WHERE rowid = 1 
-- your required output