SO olmayan hangi seçimler en çok adayı aldı?
Her Stack Exchange site moderatörü seçiminin kenar çubuğunda şunu belirten bir kutu vardır:
7 gün sonra, itibara göre sıralanan ilk 30 aday birincil aşamaya geçer. Ancak 10 veya daha az aday varsa, doğrudan seçim aşamasına geçiyoruz.
"En iyi 30" hakkındaki kısım, gördüğüm hiçbir seçimle hiç alakalı olmamıştı. Amiral gemisi sitesi Stack Overflow'daki son birkaç seçimde bile 30 kadar aday çıkmadı. "Bu SO dışında hiç alakalı mıydı" diye soracaktım, ama biraz daha geniş bir soru sormama izin verin:
SO dışındaki hangi mod seçimleri en çok adayı aldı?
Açıkçası /election
, bu bilgiyi bulmak için tüm sitelerin sayfalarında gezinebilirdim , ama belki birisi daha kolay bir yol biliyordur (veya verileri zaten toplamıştır).
Yanıtlar
Çok sayıda adayın olduğu üç seçim (sadece hafızamdan, onları kandırmadım - belki de ArtOfCode'un bunun için bir kodu vardır):
- 20'si birincil aşamaya geçen 23 adayın yer aldığı 2014 Matematik seçimi (o zamanlar sınır farklı görünüyordu);
- 2016 Worldbuilding seçim 19 adayla;
- 2018 Magento seçim 19 adaylarla.
Bu, adaylıkları silinen adayları kapsamaz (kısa süre önce askıya alındığı veya bariz bir şaka-adaylığı yayınladığı için).
Bu SEDE sorgusunu sunmama izin verin .
Bu, doğru sonucu döndürmez, ancak Glorfindel'in yanıtında açıklanan yaklaşımı uyguladığınızda doğru yanıtı bulmanıza yardımcı olabilir.
Sorgum, belirli bir seçim için şimdiye kadar yayınlanan tüm gerçek adaylara göre seçim sıralamasını gösterir. SE nazikçe geri çekilen adayları da veriyor.
Genel şemada geri çekildiklerini belirlemenin hiçbir yolunu bulamadım. Bu nedenle Glorfindel'in cevabı doğru ve bu doğru değil.
İşte çılgın bir geçici tablo ve geçici indeks ve daha da çılgın sayıda alt sorguya sahip çok siteli canavar.
Bu sorguya, adayların posttypeid = 6 ile gönderiler olarak kaydedildiğine güveniyorum. Bu gönderiler yalnızca 7 günlük kısa bir süre içinde gerçekleşecek ve bu süreler birbirinden önemli ölçüde ayrıdır.
Gönderileri oluşturulma tarihinde sıralayarak ve bir LAG ve LEAD işlevini kullanarak bir dönemin başlangıcı ve bitiminin nerede olduğunu bulabilirsiniz, çünkü günler arasında 7'den fazla farklılık olacaktır. DateDiff işlevi orada işe yarıyor. 42'yi devrilme noktası olarak aldım ve daha uzun adaylık sürelerine izin verdim. Bu başlangıç ve bitiş tarihlerini aldıktan sonra, sıraları seçim numarasının ne olduğunu belirler. Oradan, bir seçim için aday sayısını vermek için her seçim için bulunan tarih aralığında görevlere tekrar katılma meselesidir.
Sütun site adı doğru seçim sayfasına bağlanır. Orada gerçek adayların sayısını bulabilirsiniz. SEDE sorgusu sonucundaki sayı ile karşılaştırırsanız, bu aynı zamanda kaç adayın geri çekildiğini veya geri çekildiğini de gösterir.
declare @sql nvarchar(max)
create table #result (site sysname
, hostname sysname
, id integer
, creationdate datetime
)
create index #idx_hn_cd on #result(hostname, creationdate)
select @sql = N'insert into #result' + STRING_AGG(concat(N'
select ''', name ,N''' as site
, ''',hostname ,N'''
, pm.id
, pm.creationdate
from ', quotename(name), N'.dbo.posts pm
where pm.posttypeid = 6
'),N'
union all')
from (select convert(nvarchar(max),name) name
-- , convert(nvarchar(max),sitename) sitename
-- , meta
-- , domain
, concat(
-- based on an idea from Glorfindel
-- https://meta.stackexchange.com/a/321181
(case sitename
WHEN 'Audio' THEN 'video'
WHEN 'Beer' THEN 'alcohol'
WHEN 'CogSci' THEN 'psychology'
WHEN 'Garage' THEN 'mechanics'
WHEN 'Health' THEN 'medicalsciences'
WHEN 'Moderators' THEN 'communitybuilding'
WHEN 'Photography' THEN 'photo'
WHEN 'Programmers' THEN 'softwareengineering'
WHEN 'Vegetarian' THEN 'vegetarianism'
WHEN 'Writers' THEN 'writing'
WHEN 'Br' THEN 'pt'
WHEN 'Mathoverflow' THEN concat((meta+'.'), sitename)
ELSE case when sitename = domain then null else sitename end
end +'.')
, (case
when sitename <> 'mathoverflow' then (meta+'.')
else null
end)
, (case
when sitename <> 'mathoverflow' then concat((domain + '.'), 'com')
else 'net'
end)
) hostname
from (
select name
, case parsename(name,1)
when 'Meta' then parsename(name,2)
else parsename(name,1)
end [sitename]
, case parsename(name,1)
when 'Meta' then 'meta'
else null
end [meta]
, coalesce(parsename(name,3), parsename(name,2)) [domain]
from sys.databases
where database_id > 5
and (name not like '%.Meta') -- only main sites have elections
) dbs
) dbsall
exec (@sql)
select rank() over (order by count(*) desc) [ranking]
, s2 [Site name]
, election [election]
, start
, [end]
, count(*) [# nominees]
from
(
select ele_data.s2
, election
, min(ele_data.creationdate) start
, max(ele_data.creationdate) [end]
from
(
select data.s1 s2
, ceiling((row_number() over(partition by data.s1 order by creationdate) ) / 2.0) election
-- , min(creationdate) se
-- , max(creationdate) ee
, *
from (
select #result.site [s1]
, id
, datediff(
d
, lag(creationdate, 1 , '2008-09-01') over(partition by site order by creationdate)
, creationdate) [days prev]
, datediff(
d
, creationdate
,lead(creationdate, 1 , getdate()) over(partition by site order by creationdate)
) [days next]
, creationdate
from #result
) data
where [days prev] > 42 or [days next]> 42
) ele_data
group by ele_data.s2, election
) rollup
inner join #result r
on r.site = s2
and r.creationdate between start and [end]
where s2 <> 'StackOverflow'
group by s2, election, start, [end]
order by count(*) desc
Bugün çalıştırıldığında, en iyi sonuç şöyle görünür:

SEDE'nin haftada bir Pazar günü güncellendiğini unutmayın. Monica Cellio'ya yazdığı harika SEDE Eğitimi için
övgüde bulunalım . SEDE sohbetinde "Merhaba" deyin .