题解 | SQL287 最差是第几名(二)

-- row_number
WITH t1 AS (
    -- todo1:总共多少人
    SELECT 
    	SUM(number) AS total   
    FROM class_grade
),
t2 AS (
	-- todo2 求累计值
    SELECT 
    	grade,
    	number,
    	SUM(number) OVER(ORDER BY grade ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS sum_now
    FROM class_grade
    ORDER BY grade ASC
),
t3 AS (
    SELECT
        FLOOR((total+1) / 2) AS floor,
        CEIL((total+1) / 2) AS ceil
    FROM t1
),
t4 AS (
    SELECT
        grade,
        number,
        sum_now
    FROM t2

),
t5 AS (
    SELECT
        *
    FROM t4
    INNER JOIN t3
),
t6 AS (
    SELECT
        grade,
        sum_now,
        sum_now - floor AS floor_sub,
        sum_now - ceil AS ceil_sub
    FROM t5
),
t7 AS (
    SELECT
        min(floor_sub) AS min_floor
    FROM t6
    WHERE floor_sub >= 0
),
t8 AS (
    SELECT
        min(ceil_sub) AS min_ceil
    FROM t6
    WHERE ceil_sub >= 0
),
t9 AS (
    SELECT
        *
    FROM t6
    INNER JOIN t7,t8
    WHERE floor_sub = min_floor
    OR ceil_sub = min_ceil
),
t10 AS (
    SELECT
        grade
    FROM t9
    ORDER BY grade ASC
)
SELECT * FROM t10;
-- 求累计值的时候需要进行排序,间隔最小法则!

全部评论

相关推荐

King987:在校生的话建议把在校经历丰富一下,多写一些比赛。项目简介中你的项目描述太长了,多写几个技术点。必须要是亮点让面试官有的问,他就会通过你的简历,自己改一改再投面试会多一些,改不好可以聊我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务