【问题标题】:SQL Server Query for Partitioning Data用于分区数据的 SQL Server 查询
【发布时间】:2019-02-18 01:37:33
【问题描述】:

我需要为学生分配序列号。问题是数据必须先按课程划分,然后必须从 1 到 1000 分配编号。

每门课程应至少有 20 个间隔(可能不同),以容纳同一课程中的学生,以防万一有人,如果现在被遗漏了,以后会出现。

等等。

我已经尝试过分区和递归 CTE,但没有成功获得这种用于最终分配 RollNumber 的系列。

非常期待任何帮助。

谢谢。

【问题讨论】:

    标签: sql-server common-table-expression partition


    【解决方案1】:

    您可以使用子查询分两步完成此操作。首先将您的row_number() 划分为course 并按student id 排序,然后您可以通过计算row_number() 返回的先前1 值并乘以20 来将每个分区增加20

    SELECT
        s_no, 
        course, 
        rownumber + (SUM(CASE WHEN rownumber = 1 THEN 1 ELSE 0 END) OVER (ORDER BY course, s_no ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) * 20) - 20
    FROM
        (
            SELECT
                s_no, 
                course, 
                ROW_NUMBER() OVER (PARTITION BY course ORDER BY s_no) rownumber
            FROM test
        ) sub
    ORDER BY course, s_no;
    
    
    +------+--------+-----------+
    | s_no | course | rownumber |
    +------+--------+-----------+
    |    1 | A      |         1 |
    |    2 | A      |         2 |
    |    3 | A      |         3 |
    |    1 | B      |        21 |
    |    2 | B      |        22 |
    |    3 | B      |        23 |
    |    1 | C      |        41 |
    |    2 | C      |        42 |
    |    3 | C      |        43 |
    +------+--------+-----------+
    

    这与您想要的输出不完全一样,但我认为它与您所追求的相同。不过,您可以在该主查询中进行数学运算,并将每个分区的起始位置调整到您想要的任何位置。

    【讨论】:

    • 谢谢@Jnevill。我会尝试并报告回来。再次感谢。
    • 像魅力一样工作。你能帮我为下一门课程获得一个数字,它是 10 的倍数且大于 20,而不是仅仅加 20。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2015-07-23
    • 2018-08-18
    相关资源
    最近更新 更多