在 sql 开发人员 (oracle 11g) 中组织查询结果

organizing query result in sql developer (oracle 11g)

目前我在数据库中有一个名为 schedule 的 table(SQL 开发人员)。

假设availableID是1,3,7,8。 table 包含如下内容:

Stud        Title   Supervisor  Examiner    availableID    
abc         Hello     1024       1001           1
def         Hi        1024       1001           1
ghi         Hey       1002       1004           1 
xxx         hhh       1020       1011           1
jkl         hhh       1027       1010           1
try         ttt       1001       1011           1
654         bbb       1007       1012           1
gyg         888       1027       1051           1
yyi         333       1004       1022           3
fff         111       1027       1041           3
ggg         222       1032       1007           3
hhh         444       1007       1001           3
ppp         444       1005       1072           7
ooo         555       1067       1009           7
uuu         666       1030       1010           7
yyy         777       1004       1001           7
qqq         yhh       1015       1072           8
www         767       1017       1029           8
eee         566       1030       1020           8
rrr         888       1004       1031           8
abc         5555      1045       1051           8

如您所见,我使用 ORDER BY availableID asc 对这些值进行了排序。 但是,我想再次将它们组织成这样:

    Stud        Title   Supervisor  Examiner    availableID    
    abc         Hello     1024       1001           1
    def         Hi        1024       1001           1
    ghi         Hey       1002       1004           1 
    xxx         hhh       1020       1011           1
    yyi         333       1004       1022           3
    fff         111       1027       1041           3
    ggg         222       1032       1007           3
    hhh         444       1007       1001           3
    ppp         444       1005       1072           7
    ooo         555       1067       1009           7
    uuu         666       1030       1010           7
    yyy         777       1004       1001           7
    qqq         yhh       1015       1072           8
    www         767       1017       1029           8
    eee         566       1030       1020           8
    rrr         888       1004       1031           8
    jkl         hhh       1027       1010           1
    try         ttt       1001       1011           1
    654         bbb       1007       1012           1
    gyg         888       1027       1051           1
    ........
    abc         5555      1045       1051           8

对于每个 availableID 它将调用四次然后继续下一个 availableID。接下来它将迭代回最低 ID 但使用不同的其他值。 Stud 必须不同。

是否可以通过使用 sql 查询来实现?

你可以用 row_number() 和一些算术来做到这一点。类似于:

Select t.*
From (select t.*,
             Row_number() over (partition by availableid order by stud) as seqnum 
      From t
     ) t
Order by trunc((seqnum - 1) / 4), availableid

与上述稍有不同的等效方法,使用 floor 并按相同的 availableID 列进行分区和分组 -

select a.stud,
       a.title,
       a.supervisor, 
       a.examiner,
       a.availableID 
from ( select s.*,row_number() over (partition by availableID order by availableID) rn 
       from student s) a 
order by floor((rn-1)/4),availableID