На каких выборах, не принадлежащих к СО, было больше всего кандидатов?

Aug 17 2020

У каждого выбора модератора сайта Stack Exchange на боковой панели есть поле с надписью:

По прошествии 7 дней 30 лучших номинантов, упорядоченных по репутации, переходят к основному этапу. Однако, если кандидатов 10 или меньше, мы сразу переходим к этапу выборов.

Фраза о «30 лучших» никогда не была актуальной ни на каких выборах, которые я видел. Даже на последних нескольких выборах на флагманском сайте Stack Overflow не было целых 30 кандидатов. Я собирался спросить, «было ли это когда-нибудь актуально за пределами SO», но позвольте мне задать более широкий вопрос:

на каких модных выборах, кроме SO, было больше всего кандидатов?

Очевидно, я мог бы пролистать /electionстраницы всех сайтов, чтобы найти эту информацию, но, возможно, кто-то знает более простой способ (или уже собрал данные).

Ответы

12 Glorfindel Aug 17 2020 at 01:19

Три выбора с большим количеством кандидатов (просто по памяти, я их не соскребал - возможно, в ArtOfCode есть какой-то код для этого):

  • выборы по математике в 2014 г. с 23 кандидатами, 20 из которых прошли в начальную фазу (кажется, тогда был другой предел);
  • 2016 миреЗдания выборы с 19 кандидатами;
  • 2018 Magento выборы с 19 кандидатов.

При этом не учитываются кандидаты, номинации которых были удалены (из-за недавней приостановки или публикации очевидной шутки-выдвижения).

12 rene Aug 17 2020 at 21:12

Разрешите предложить этот запрос SEDE .

Это не вернет правильный результат, но может помочь вам найти правильный ответ, если вы примените подход, описанный в ответе Глорфинделя.

Мой запрос показывает рейтинг выборов на основе всех фактических номинаций, когда-либо опубликованных для этих конкретных выборов. SE любезно по-прежнему предоставляет снятые номинации.

Я не нашел способа в публичной схеме определить, что они были отозваны. Вот почему ответ Глорфинделя правильный, а этот - нет.

Итак, это многосайтовый зверь с безумной временной таблицей и временным индексом и еще более безумным количеством подзапросов.

Я полагаюсь в этом запросе на тот факт, что номинации регистрируются как сообщения с posttypeid = 6. Эти сообщения будут происходить только в течение короткого 7-дневного периода, и эти периоды значительно отличаются друг от друга.

При заказе на сообщения CreationDate и с помощью LAG и LEAD функции , чтобы найти время в дни между столбами вы можете найти , где начало и конец периода, как те будут иметь разницу в дни , что является более 7. DateDiff функции там пригодится. Я выбрал 42 как переломный момент, позволяющий выдвигать более длительные сроки. Если у вас есть даты начала и окончания, их порядок определяет номер выборов. Затем нужно снова присоединиться к постам в диапазоне дат, найденном для каждых выборов, чтобы получить количество кандидатов на выборы.

Название сайта в столбце указывает на правильную страницу выборов. Там вы можете узнать количество реальных кандидатов. Это также покажет, сколько номинантов отозвали или были отозваны, если вы сравните это с числом в результате запроса 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

При сегодняшнем запуске вот как выглядит лучший результат:

Имейте в виду, что SEDE обновляется раз в неделю в воскресенье.
Давайте похвалим добрую Монику Челлио за великолепный учебник по SEDE, который она написала.
Скажите «Привет» в чате SEDE .