Great câu hỏi.
- Giải pháp này trả về tất cả các bản phân phối có thể, sắp xếp theo ưu tiên được xác định bởi các thông tin như số người sử dụng tham gia, tài liệu tối thiểu cho mỗi người dùng, độ lệch chuẩn của nhiệm vụ cho mỗi người dùng, vv
- Tôi không tính vào document.id là một chuỗi các số bắt đầu bằng 1, do đó việc sử dụng dense_rank.
- Cốt lõi của các giải pháp là CTE lặp lại tạo ra các bộ bản ghi của tất cả các bản phân phối có thể có. Hiện
- Thực hiện trên máy tính xách tay của tôi là khoảng 20 giây, (phần lặp đi lặp lại mất 5 giây)
with doc_user as
(
select d."id" as docid
,p."user" as userid
,dense_rank () over (order by d."id") as doc_seq
from documents d
left join permissions p
on p.type = d.type
)
,it_cte as
(
select docid
,userid
,doc_seq
,cast (coalesce(userid,'') as varchar(max)) as path
,'A' as cte_part
from doc_user
where doc_seq = 1
union all
select r.docid
,r.userid
,du.doc_seq
,r.path + ',' + coalesce (du.userid,'')
,'B'
from it_cte as r
cross join doc_user as du
where du.doc_seq = r.doc_seq + 1
union all
select du.docid
,du.userid
,du.doc_seq
,r.path + ',' + coalesce (du.userid,'')
,'C'
from it_cte as r
cross join doc_user as du
where du.doc_seq = r.doc_seq + 1
and r.cte_part in ('A','C')
)
,result_sets as
(
select dense_rank () over (order by path) as set_id
,docid
,userid
from it_cte
where doc_seq = (select count(*) from documents)
)
,result_sets_stat as
(
select set_id
,count (distinct userid) as users_involved
from result_sets
group by set_id
)
,result_sets_users_stat as
(
select set_id
,min (doc) min_doc_per_user
,stdevp (doc) stdevp_doc_per_user
from (select set_id
,userid
,count (*) as doc
from result_sets
group by set_id
,userid
) t
group by set_id
)
select s.set_priority
,r.docid
,r.userid
,s.users_involved
,s.min_doc_per_user
,s.stdevp_doc_per_user
from (select s.set_id
,s.users_involved
,u.min_doc_per_user
,u.stdevp_doc_per_user
,row_number() over
(
order by s.users_involved desc
,u.min_doc_per_user desc
,u.stdevp_doc_per_user
,s.set_id
) as set_priority
from result_sets_stat as s
join result_sets_users_stat as u
on u.set_id =
s.set_id
) s
join result_sets as r
on r.set_id =
s.set_id
order by s.set_priority
,r.docid
option (merge join)
;
Đó là một câu hỏi hay –
Sau khi đọc câu hỏi của bạn, và @Prdp bình luận, Khi bạn nói - phân phối tài liệu - Bạn có nghĩa là phân phối đồng đều không? i, e, phân phối tải công việc? –