如何选择每个特定数据达到一定数量。例如,在下表中,有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 |
+----+--------+
有人可以帮我解决上述情况吗?
答案 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
)按字母排列的行,并为每个字母分配一个数字,然后选择每个字母的前两个。
在这里试试:
答案 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