如何选择特定数量的每个特定数据?

时间:2017-09-13 17:01:57

标签: sql sql-server

如何选择每个特定数据达到一定数量。例如,在下表中,有4个A,4个B,2个C和1个D.现在我想选择所有字母,但每个字母不超过两个,这将产生2个A,2个B,2个C和1个d。

+====+========+
| ID | Letter |
+====+========+
|  1 | A      |
+----+--------+
|  2 | B      |
+----+--------+
|  3 | B      |
+----+--------+
|  4 | C      |
+----+--------+
|  5 | A      |
+----+--------+
|  6 | A      |
+----+--------+
|  7 | C      |
+----+--------+
|  8 | B      |
+----+--------+
|  9 | B      |
+----+--------+
| 10 | D      |
+----+--------+
| 11 | A      |
+----+--------+  

有人可以帮我解决上述情况吗?

3 个答案:

答案 0 :(得分:2)

我可以想到一个简单的方法:

select 
    case 
        when count(*) > 1 
            then 2 
        else count(*) 
    end,
    second_column
from your_table 
group by second_column;

这将给出您想要的结果,但它实际上不会只选择两个或更少的记录'每个。

答案 1 :(得分:2)

使用ROW_NUMBER()函数和派生表:

CREATE TABLE myTable (id int, Letter varchar(1))

INSERT INTO myTable
VALUES (1,'A')
                ,(2,'B')
                ,(3,'B')
                ,(4,'C')
                ,(5,'A')
                ,(6,'A')                    
                ,(7,'C')
                ,(8,'B')
                ,(9,'B')
                ,(10,'D')
                ,(11,'A')

SELECT id, Letter
FROM
(SELECT *
    ,ROW_NUMBER() OVER(PARTITION BY Letter ORDER BY Letter) as rn
FROM myTable) myTable
WHERE rn = 1 or rn = 2

从本质上讲," cut" (PARTITION)按字母排列的行,并为每个字母分配一个数字,然后选择每个字母的前两个。

在这里试试:

http://rextester.com/WTKYCE51114

答案 2 :(得分:0)

使用ROW_NUMBER()函数标记每个记录的行号和PARTITION it BY(分组依据)字母和ORDER it BY(id)

SELECT id,
       letter
  FROM (SELECT *,
               ROW_NUMBER() OVER(PARTITION BY letter ORDER BY id) rnum
          FROM myTable
       ) t
 WHERE rnum <=2

按ID排序,每个字母的前两个实例按升序排列,因此您将得到以下结果(请注意,为A选择id 1和5,为B选择2和3)

id  letter
1   A
5   A
2   B
3   B
4   C
7   C
10  D