การเลือกตั้งที่ไม่ใช่ SO ใดมีผู้สมัครมากที่สุด

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 คน
  • การเลือกตั้ง Magento ปี 2018โดยมีผู้สมัคร 19 คน

ไม่นับรวมผู้สมัครที่ถูกลบการเสนอชื่อ (เนื่องจากเพิ่งถูกระงับหรือโพสต์เรื่องตลกที่ได้รับการเสนอชื่อ)

12 rene Aug 17 2020 at 21:12

อนุญาตให้ฉันเสนอแบบสอบถาม SEDEนี้

สิ่งนี้จะไม่ส่งคืนผลลัพธ์ที่ถูกต้อง แต่สามารถช่วยคุณค้นหาคำตอบที่ถูกต้องได้เมื่อคุณใช้แนวทางที่อธิบายไว้ในคำตอบของ Glorfindel

ข้อความค้นหาของฉันแสดงการจัดอันดับการเลือกตั้งตามการเสนอชื่อจริงทั้งหมดที่เคยโพสต์สำหรับการเลือกตั้งเฉพาะนั้น SE ยังคงให้การเสนอชื่อที่ถูกถอดถอนเช่นกัน

ฉันไม่พบวิธีใดในสคีมาสาธารณะที่จะตัดสินว่าพวกเขาถูกถอนออก ซึ่งเป็นสาเหตุที่คำตอบจากกลอร์ฟินเดลถูกต้องและคำตอบนี้ไม่ถูกต้อง

ดังนั้นนี่คือสัตว์ร้ายหลายไซต์ที่มีตารางอุณหภูมิและดัชนีอุณหภูมิที่บ้าคลั่งและจำนวนแบบสอบถามย่อยที่บ้ายิ่งกว่า

ฉันอาศัยข้อสงสัยนี้เกี่ยวกับข้อเท็จจริงที่ว่าการเสนอชื่อถูกบันทึกเป็นโพสต์ที่มี posttypeid = 6 โพสต์เหล่านี้จะเกิดขึ้นในช่วงเวลาสั้น ๆ 7 วันเท่านั้นและช่วงเวลาเหล่านี้จะอยู่ห่างกันอย่างมีนัยสำคัญ

โดยการสั่งให้โพสต์ในวันที่สร้างและใช้ฟังก์ชัน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 จะอัปเดตสัปดาห์ละครั้งในวันอาทิตย์
ขอยกย่องMonica Cellio ผู้ใจดีสำหรับSEDE Tutorial ที่เธอเขียน
พูดว่า "สวัสดี" ในSEDE แชท