题
我有一个表这样的:
Rank Letter 1 A 2 A 3 B 4 A 5 C 6 A 7 C 8 C 9 B 10 C
我需要顶2的每个字母排序上升的等级:
Rank Letter 1 A 2 A 3 B 5 C 7 C 9 B
我该怎么做?它相当直接得到的只是顶部使用1小组由,但我似乎无法得到它的工作的多个项
解决方案
select distinct rank, letter
from table1 t2
where rank in
(select top 2 rank
from table1 t2
where t2.letter = t1.letter
order by rank)
order by letter, rank
编辑:(我第一次尝试不会MySql上(Quassnoi评论)工作,我修改了它例如SQL服务器上运行)
第二次尝试:
select t.letter, t.rank
from table1 t
join (
select t1.letter, min(t1.rank) m
from table1 t1
join (select t0.letter, min(t0.rank) m, count(1) c
from table1 t0 group by t0.letter) t2
on t1.letter = t2.letter and ((t2.c = 1) or (t2.c > 1 and t1.rank > m))
group by t1.letter) t3
on t.letter = t3.letter and t.rank <= t3.m
其他提示
SELECT mo.Letter, md.Rank
FROM (
SELECT DISTINCT letter
FROM mytable
) mo
JOIN mytable md
ON md.Letter >= mo.Letter
AND md.Letter <= mo.Letter
AND Rank <=
COALESCE
(
(
SELECT Rank
FROM mytable mi
WHERE mi.letter = mo.letter
ORDER BY
Rank
LIMIT 1, 1
),
0xFFFFFFFF
)
你需要有一个综合指数上 (Letter, Rank)
(按此顺序)
注意这个结构:
md.Letter >= mo.Letter
AND md.Letter <= mo.Letter
而不是仅仅 md.Letter = mo.Letter
它的力量 Range checked for each record
这是更有效率。
看看这篇文章在我的博客:
更多详细信息。
不隶属于 StackOverflow