在SQL Server表中的每个组中随机选择固定数量的行

时间:2015-07-28 03:27:49

标签: sql sql-server

我需要进行SQL查询才能从大表中查找一些条目。

表:

 id  value1 value2 
 ny  35732  8023 
 ny   732  23
 ny   292  109
 nj   8232  813
 nj   241   720
 nj   590   287

我需要随机从每个不同的ID群组中选择2个条目 uch

 id  value1 value2 
 ny  35732  8023 
 ny   292  109
 nj   8232  813
 nj   590   287

我的SQL代码:

 select top 2 * from my_table group by id value1 value2 

但是,这不是我想要的。

我还需要将结果插入表中。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用ROW_NUMBER并使用NEWID()生成随机ORDER

编辑:我将CHECKSUM(NEWID())替换为NEWID(),因为我无法证明哪个更快,NEWID()是我认为最常用的。

WITH CTE AS(
    SELECT *,
        RN = ROW_NUMBER() OVER(PARTITION BY id ORDER BY NEWID())
    FROM tbl
)
SELECT
    id, value1, value2
FROM Cte
WHERE RN <= 2

SQL Fiddle

小提琴应该在不同的跑步中显示不同的结果。

如果要将其插入另一个表,请使用此子查询版本:

INSERT INTO yourNewTable(id, value1, value2)
    SELECT
        id, value1, value2
    FROM (
        SELECT *,
            RN = ROW_NUMBER() OVER(PARTITION BY id ORDER BY NEWID())
        FROM tbl
    )t
    WHERE RN <= 2

答案 1 :(得分:1)

DECLARE  @Table1 TABLE 
    (id varchar(2), value1 int, value2 int)
;

INSERT INTO @Table1
    (id, value1, value2)
VALUES
    ('ny', 35732, 8023),
    ('ny', 732, 23),
    ('ny', 292, 109),
    ('nj', 8232, 813),
    ('nj', 241, 720),
    ('nj', 590, 287)
;


SELECT *
FROM   @Table1 T
WHERE 
        (
            SELECT  COUNT(*) 
            FROM    @Table1  TT
            WHERE T.id = TT.id AND 
                  T.value1 >= TT.value1
        ) <= 2

答案 2 :(得分:0)

微软就是这样:

SELECT TOP 10 PERCENT *
  FROM Table1
  ORDER BY NEWID()

有关更多示例,请参阅https://msdn.microsoft.com/en-us/library/Cc441928.aspx