V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
flyingfz
V2EX  ›  PostgreSQL

高考时,会有一个统计:每一分,有多少人, 这种需求的 SQL 语句改怎么写

  •  
  •   flyingfz · 2018-04-28 15:05:46 +08:00 · 4030 次点击
    这是一个创建于 2400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    突然想到这样的一个需求,思考了一下, 一时没有思路,请教一下大家。

    1. 数据量可能会比较大
    2. 数据库 暂定 PG
    3. 有可能 把 1 分 ,改成 10 分 为一个区段。
    25 条回复    2018-11-19 17:26:19 +08:00
    flyingfz
        1
    flyingfz  
    OP
       2018-04-28 15:10:31 +08:00
    貌似 用 CASE when 语句, 能解决问题。。。。
    janus77
        2
    janus77  
       2018-04-28 15:11:02 +08:00
    高考没那么大数据吧 各省自己统计自己的,百万都不到
    iiduce
        3
    iiduce  
       2018-04-28 15:16:33 +08:00
    开玩笑的讲,猜测事实的解决方法有可能是级级上报,这一级解决不了就让小一级的上报,最后是班主任让班长统计一下班里的,很简单啦。
    DreaMQ
        4
    DreaMQ  
       2018-04-28 15:20:49 +08:00
    先暂且假设你能得到精确到个人的数据
    SELECT count(*) FROM <table> WHERE score = ?
    对每一个分数跑一次,然后就可以做各种统计了吧
    高考全国最多也就千万量级
    vegito2002
        5
    vegito2002  
       2018-04-28 15:27:19 +08:00
    group by 分, 然后 count 什么的
    不行吗? 前提是分数保存的是整数
    Smilencer
        6
    Smilencer  
       2018-04-28 15:33:00 +08:00
    case when + group by
    ReVanTis
        7
    ReVanTis  
       2018-04-28 15:34:04 +08:00   ❤️ 1
    你们没有意识到这个问题需要生成的实际上是直方图而不是简单的 group by 分数吗。。。

    ref:
    https://stackoverflow.com/questions/1764881/getting-data-for-histogram-plot
    layorlayor
        8
    layorlayor  
       2018-04-28 16:01:37 +08:00
    窗口函数???
    Luckyray
        9
    Luckyray  
       2018-04-28 16:10:27 +08:00 via iPhone
    @iiduce 数据库都在省里……一般出分前分数段人数表就出来了
    zst
        10
    zst  
       2018-04-28 16:14:56 +08:00 via Android
    高考分一定是整数的(至少我们是)直接 group by+count 就好了吧 按河南(我记得最大的)的量级也就是不到百万 还得文理分开
    qwjhb
        11
    qwjhb  
       2018-04-28 16:15:29 +08:00
    这种?
    doubleflower
        12
    doubleflower  
       2018-04-28 16:26:54 +08:00 via Android
    循环 1 到 100 查 100 次不就行了
    pmispig
        13
    pmispig  
       2018-04-28 16:27:18 +08:00
    这种静态的没必要一条语句做到,从 0-700,生成 700 条语句执行,写入一个新表就行了
    jydeng
        14
    jydeng  
       2018-04-28 16:28:47 +08:00
    group by,然后 count 最直接了
    worldnode
        15
    worldnode  
       2018-04-28 16:33:17 +08:00
    我突然想到的是,高考要靠 sql ....
    takato
        16
    takato  
       2018-04-28 16:36:15 +08:00
    23333
    楼主是在统计 orderbook 吗?
    bomb77
        17
    bomb77  
       2018-04-28 16:44:23 +08:00
    一年全国的高考学生也就在一千万左右吧,group by 后 count 一下应该不会很慢,而且这种数据也不会变化,取一次就可以缓存起来了。。
    breadenglish
        18
    breadenglish  
       2018-04-28 16:48:51 +08:00
    不要性能的话 case when + group by,子查询搞定。要性能的话加个表,存储刻度,然后关联搞定。
    lafuerza
        19
    lafuerza  
       2018-04-28 17:09:03 +08:00
    该,最近 V2 上好多错别字
    CEBBCAT
        20
    CEBBCAT  
       2018-04-28 17:10:13 +08:00 via Android
    没听懂,官方不是提供一分一档表吗?难道形势变了?
    banbo
        21
    banbo  
       2018-04-28 17:23:24 +08:00
    windowing function
    ctsed
        22
    ctsed  
       2018-04-28 17:30:30 +08:00
    es 了解一下
    qf19910623
        23
    qf19910623  
       2018-04-28 17:39:01 +08:00
    这种数据考完了就固定了,不会变动,不需要实时查询,可以分区域统计,甚至人工统计层层上报也没什么问题
    beginor
        24
    beginor  
       2018-10-22 07:48:23 +08:00 via Android
    我来挖个坟, 使用 pg 生成序列函数,从 0 分到满分生成一个序列,再和分数表关联查询,貌似很容易吧
    reus
        25
    reus  
       2018-11-19 17:26:19 +08:00
    SELECT count(*), score / 10
    FROM scores
    GROUP BY score / 10

    不就行了……想那么复杂
    这个查询在 pg 11 下,是并行扫描的
    而且,还能建索引 CREATE INDEX ON scores USING btree((score / 10))
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2603 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:53 · PVG 12:53 · LAX 20:53 · JFK 23:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.