我有一个大表,我必须找到3个唯一的id记录,从每个状态,我在子句中。尼斯时,如果发现3记录,他停止寻找这个状态,并会寻找下一个最多3。表是非常大的,我关心的效率和搜索将被使用多次。
我有:
| ID|地位|
| --------------|--------------|
| 1|a|
| 1|B|
| 1|B|
| 1|d|
| 第二章|d|
| 第二章|B|
| 第二章|B|
| 第二章|c|
| 第二章|B|
| 三|a|
| 三|a|
| 三|B|
| 三|e|
| 四|a|
| 四|B|
| 五|a|
| 五|B|
SELECT a.*
FROM (
select
id,
status,
ROW_NUMBER() OVER(PARTITION BY id ORDER BY status) as rn,
ROW_NUMBER() OVER(PARTITION BY status ORDER BY id) as rne
from x
where status in ('a', 'b' , 'e')
) a
WHERE rn <= 1 and rne <=3;
这段代码查找记录的时间太长了,我需要有更高效的东西
我需要的结果:
| 身份证|地位|
| --------------|--------------|
| 1|a|
| 三|a|
| 四|a|
| 1|B|
| 第二章|B|
| 三|B|
| 三|e|
2条答案
按热度按时间k0pti3hp1#
试试这个(你需要一个列来排序,这里我添加了“rn”,但它可能是一个日期):
oprakyz72#
尝试组合使用Group By来消除重复项,并使用一个简单的Count()Over()分析函数来为每个STATUS只获取三行。