Quali elezioni non-SO hanno avuto il maggior numero di candidati?

Aug 17 2020

Ogni elezione del moderatore del sito di Stack Exchange ha una casella nella barra laterale che dice:

Dopo 7 giorni, i primi 30 candidati, ordinati per reputazione, avanzano alla fase primaria. Tuttavia, se ci sono 10 o meno candidati, si passa direttamente alla fase elettorale.

La parte sulla "top 30" non è mai stata rilevante in nessuna elezione che ho visto. Anche nelle ultime elezioni sul sito principale Stack Overflow, non ci sono stati fino a 30 candidati. Stavo per chiedere "è mai stato rilevante al di fuori di SO", ma lasciatemi porre una domanda leggermente più ampia:

quali elezioni mod, al di fuori di SO, hanno avuto più candidati?

Ovviamente potrei sfogliare tutte le /electionpagine dei siti per trovare queste informazioni, ma forse qualcuno conosce un modo più semplice (o ha già raccolto i dati).

Risposte

12 Glorfindel Aug 17 2020 at 01:19

Tre elezioni con molti candidati (solo a memoria, non le ho cancellate - forse ArtOfCode ha del codice per questo):

  • le elezioni di Matematica del 2014 , con 23 candidati, di cui 20 avanzati alla fase primaria (il limite allora era diverso, a quanto pare);
  • le elezioni per la costruzione del mondo del 2016 con 19 candidati;
  • l' elezione di Magento del 2018 con 19 candidati.

Questo non conta i candidati le cui candidature sono state cancellate (a causa della recente sospensione o della pubblicazione di un'evidente battuta-candidatura).

12 rene Aug 17 2020 at 21:12

Consentitemi di offrire questa query SEDE .

Questo non restituirà il risultato corretto ma può aiutarti a trovare la risposta corretta quando applichi l'approccio descritto nella risposta di Glorfindel.

La mia domanda mostra la classifica delle elezioni basata su tutte le nomination effettive mai pubblicate per quella specifica elezione. SE fornisce gentilmente anche le candidature che sono state ritirate.

Non ho trovato alcun modo nello schema pubblico per determinare che fossero stati ritirati. Ecco perché la risposta di Glorfindel è corretta e questa no.

Quindi ecco la bestia multi-sito con una tabella temporanea e un indice temporaneo folli e un numero ancora più folle di query secondarie.

Mi baso in questa query sul fatto che le nomination sono registrate come post con posttypeid = 6. Questi post verranno pubblicati solo in un breve periodo di 7 giorni e questi periodi sono significativamente separati l'uno dall'altro.

Ordinando i post alla data di creazione e utilizzando una funzione LAG e LEAD per trovare il tempo in giorni tra i post puoi trovare dove si trova l'inizio e la fine di un periodo, poiché questi avranno una differenza in giorni che è superiore a 7. La funzione DateDiff è utile lì. Ho considerato 42 come il punto di svolta, consentendo periodi di nomina prolungati. Una volta che hai queste date di inizio e fine, il loro ordine determina qual è il numero di elezione. Da lì si tratta di unire di nuovo i post nell'intervallo di date trovato per ciascuna elezione per fornire il numero di candidati per un'elezione.

Il nome del sito della colonna si collega alla pagina delle elezioni corretta. Qui puoi trovare il numero di candidati effettivi. Questo indicherà anche quanti candidati si sono ritirati o sono stati ritirati, se lo confronti con il numero nel risultato della query SEDE.

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

Quando viene eseguito oggi, questo è l'aspetto del risultato migliore:

Tieni presente che SEDE viene aggiornato una volta alla settimana la domenica.
Lodiamo la gentile Monica Cellio per il fantastico tutorial SEDE che ha scritto.
Dì "Ciao" nella chat di SEDE .