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

时间:2017-03-24 10:34:11

标签: sql-server

我有两张桌子如下。

表1

id rem   
1   2
2   1   

表2

id value
1   abc
1   xyz
1   mno
2   mnk
2   mjd

编辑:

#output
id value
1  abc
1  xyz
2  mnk

我想要做的是选择前2行table2,其中id为1,因为对于id 1,rem值为2,而对于id为2,则前1行为id 2,依此类推。我正在使用MS sqlserver 2012我的整个场景比这更复杂。请帮忙。
谢谢。
编辑:我知道我应该已经完成​​了我所做的事情以及我是如何做到的但是对于这个特殊的部分,我并不知道如何开始。我可以通过对每个唯一ID使用while循环来做到这一点,但如果可能的话,我想一次性完成。

2 个答案:

答案 0 :(得分:1)

首先,SQL表代表无序集。除非您包含order by

,否则不会指定您获得的值

为此目的,我会选择row_number()

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;

注意:windows子句中的order by id应该基于您想要的行。如果您不关心哪些行,那么order by idorder by (select null)就可以了。

答案 1 :(得分:0)

试试这个:

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

希望它有所帮助。