在这里提问时还是新手,所以这是我第二次尝试解决我遇到的问题。
我有一张已按分数排序的表格。每条记录可以是3种类型之一。我想按分数对表格进行重新排序,但每10条记录对混合施加一个额外的限制。特别地,存在由3种类型中的每一种组成的特定混合物。
在下面的示例中,我希望至少有2个C类型,最多2个类型A
我有什么
------------------------------------------
ID Score Type
------------------------------------------
1 100 A
2 99 B
3 97 B
4 92 A
5 91 C
6 85 A
7 83 B
8 81 B
9 75 B
10 70 B
11 65 A
12 61 C
13 59 B
我想要什么
------------------------------------------
ID Score Type
-----------------------------------------
1 100 A
2 99 B
3 97 B
4 92 A
5 91 C
7 83 B
8 81 B
9 75 B
10 70 B
12 61 C
我不认为这可以通过Group By或以有效的方式解决。我最初的解决方案是导出到PHP并在那里进行重新排序。
答案 0 :(得分:0)
我假设您希望返回TYPE = C的所有行,并且返回TYPE = B的所有行,但返回的TYPE = A最多只有2行。
这将在ORACLE中工作 - 可以在子查询中使用ROWNUM来限制行数。
(在另一个数据库中,可能甚至没有实现ROWNUM)
SELECT
T.*
FROM
(
select *
from
(
select T.ID, T.SCORE, T.TYPE
from YourTable T
WHERE TYPE='A'
ORDER BY T.SCORE DESC
)
WHERE ROWNUM <=2
UNION
select *
from
(
select T.ID, T.SCORE, T.TYPE
from YourTable T
WHERE TYPE='B'
ORDER BY T.SCORE DESC
)
UNION
select *
from
(
select T.ID, T.SCORE, T.TYPE
from YourTable T
WHERE TYPE='C'
ORDER BY T.SCORE DESC
)
) T
ORDER BY T.SCORE DESC;
答案 1 :(得分:0)
试试这个:
SELECT id, score, a.type
FROM (SELECT id, score, a.type, IF(@lasttype = (@lasttype:=a.type), @index:=@index+1, @index:=0) indx
FROM tablename t, (SELECT @lasttype:='', @index:=0) AS a
ORDER BY TYPE, score DESC) AS a
WHERE (a.type NOT IN ('A', 'C') OR (a.type IN ('A', 'C') AND indx <= 2))
ORDER BY score DESC;