我有两张桌子 表A是village_info 表B是survey_info
village_info 有字段 Village_id 和 is_active
survey_info 有字段 Survey_id、survey_numbers、village_id、is_active
表中的关系是一对多 IE 每个村庄都有很多的survey_numbers
使用关系进行查询
选择 Village_info.village_id, Survey_info.survey_numbers 来自村庄信息 加入 调查信息 在 Village_info.village_id = Survey_info.village_id 其中 Village_info.is_active =1 且 Survey_info.is_active=1;
我的要求是为每个村庄获取 20 个随机调查号码
这是我的表格结构
表A:village_info
村庄_id
1
2
3
4
5
表B:survey_info Survey_numbers Village_id “12/3”1 “7/3”1 “23/4”1 “44/5”1 。 。 。 。 。 .
请求优化查询以获取每个村庄的随机 20 个 Survey_numbers,我有 Village_id 列表
我尝试了很多使用窗口函数和分组的方法,但它不是那么优化并且永远花费太多时间 该表拥有庞大的数据集,超过 2000 万个调查数据 我有给出解决方案的最后期限,请这样做,需要充分
解决方案是值得等待的回复
感谢与问候 拉梅什
我有 Village_list = [village_id1, Village_id2.......] 的列表
选择调查编号 来自调查信息 WHERE Village_id in {[village_id1, Village_id2.......] AND Survey_meta.is_active = 1 按 RAND() 限制排序
这就是使用窗口函数的方法:
select village_id, survey_numbers
from (
select village_info.village_id, survey_info.survey_numbers,
row_number() over (partition by village_info.village_id order by rand()) as rn
from village_info
join survey_info on village_info.village_id = survey_info.village_id
where village_info.is_active=1 and survey_info.is_active=1
)
where rn <= 20
(如果您想要特定的村庄,请将
and village_info.village_id in (...)
添加到子查询的where子句中。)