Quelles élections non SO ont eu le plus de candidats?

Aug 17 2020

Chaque élection de modérateur de site Stack Exchange a une case dans la barre latérale indiquant:

Après 7 jours, les 30 meilleurs nominés, classés par réputation, passent à la phase principale. Cependant, s'il y a 10 candidats ou moins, nous passons directement à la phase électorale.

Le peu sur le «top 30» n'a jamais été pertinent dans aucune élection que j'ai vue. Même lors des dernières élections sur le site phare Stack Overflow, il n'y a pas eu jusqu'à 30 candidats. J'allais demander "est-ce que cela a déjà été pertinent en dehors de SO", mais permettez-moi de poser une question un peu plus large:

Quelles élections mod, en dehors de SO, ont eu le plus de candidats?

Évidemment, je pourrais parcourir les /electionpages de tous les sites pour trouver ces informations, mais peut-être que quelqu'un connaît un moyen plus simple (ou a déjà collecté les données).

Réponses

12 Glorfindel Aug 17 2020 at 01:19

Trois élections avec beaucoup de candidats (juste de mémoire, je ne les ai pas grattés - peut-être que ArtOfCode a du code pour cela):

  • l' élection de mathématiques de 2014 , avec 23 candidats, dont 20 sont passés à la phase primaire (la limite était alors différente, semble-t-il);
  • l' élection de Worldbuilding 2016 avec 19 candidats;
  • l' élection Magento 2018 avec 19 candidats.

Cela ne prend pas en compte les candidats dont les candidatures ont été supprimées (en raison d'une suspension récente ou de l'affichage d'une blague-nomination évidente).

12 rene Aug 17 2020 at 21:12

Permettez-moi de vous proposer cette requête SEDE .

Cela ne renverra pas le résultat correct, mais cela peut vous aider à trouver la bonne réponse lorsque vous appliquez l'approche décrite dans la réponse de Glorfindel.

Ma requête montre le classement des élections en fonction de toutes les nominations réelles jamais publiées pour cette élection spécifique. SE continue de fournir les nominations qui ont été retirées.

Je n'ai trouvé aucun moyen dans le schéma public de déterminer qu'ils avaient été retirés. C'est pourquoi la réponse de Glorfindel est correcte et celle-ci ne l'est pas.

Voici donc la bête multi-site avec une table temporaire et un index temporaires insensés et un nombre encore plus insensé de sous-requêtes.

Je me fie dans cette requête au fait que les nominations sont enregistrées en tant que messages avec posttypeid = 6. Ces messages ne se produiront que dans une courte période de 7 jours et ces périodes sont très éloignées les unes des autres.

En ordonnant les articles à la date de création et en utilisant une fonction LAG et LEAD pour trouver le temps en jours entre les articles, vous pouvez trouver où se trouvent le début et la fin d'une période, car ceux-ci auront une différence en jours supérieure à 7. La fonction DateDiff est utile là-bas. J'ai pris 42 pour être le point de basculement, permettant des périodes de nomination prolongées. Une fois que vous avez ces dates de début et de fin, leur ordre détermine le numéro d'élection. À partir de là, il s'agit de rejoindre à nouveau les postes à la plage de dates trouvée pour chaque élection pour donner le nombre de candidats à une élection.

Le nom du site de la colonne renvoie à la bonne page d'élection. Vous y trouverez le nombre de candidats réels. Cela indiquera également combien de candidats se sont retirés, ou ont été retirés, si vous comparez cela avec le nombre dans le résultat de la requête 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

Lorsqu'il est exécuté aujourd'hui, voici à quoi ressemble le meilleur résultat:

Gardez à l'esprit que SEDE est mis à jour une fois par semaine le dimanche.
Faisons l'éloge de la gentille Monica Cellio pour l'impressionnant tutoriel SEDE qu'elle a écrit.
Dites «Bonjour» dans le chat SEDE .