Sql server SQL Server:如何根据组列的值选择组的顶行?
我有两张像下面这样的桌子 表1 表2 编辑: 我要做的是选择表2中id为1的前2行作为id为1的rem值为2,选择id为2的前1行作为rem值为1,依此类推。我使用的是MS sqlserver 2012,我的整个场景比这更复杂。请帮忙。 非常感谢。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,否则没有关于获得哪些值的说明
编辑:我知道我应该给出我所做的和我是如何做的,但对于这一部分,我没有开始的想法。我可以通过对每个唯一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