我要求将记录平均分配到两个类别。但如果我没有任何一个类别的记录,我应该计算其他类别的剩余记录。
示例数据:
如果这样的科目s1的学生是12,而科目s2是20.我需要挑选30名学生,结果应该给我15个每个科目,但是因为s1总共只有12,我应该从s1获得12 18来自s2。
答案 0 :(得分:0)
这应该可以解决问题:
DECLARE @t TABLE(ID INT, Student VARCHAR(10), Subject CHAR(2))
INSERT INTO @t VALUES
(1, 'Stud1', 's1'),
(2, 'Stud2', 's1'),
(3, 'Stud3', 's2'),
(4, 'Stud4', 's2'),
(5, 'Stud5', 's2'),
(6, 'Stud6', 's2'),
(7, 'Stud7', 's2'),
(8, 'Stud8', 's2'),
(9, 'Stud9', 's2')
;WITH cte AS(SELECT *, ROW_NUMBER() OVER(PARTITION BY Subject ORDER BY ID) AS rn FROM @t)
SELECT TOP 7 *
FROM cte
ORDER BY rn, Subject
这个想法是你在主题中对行进行编号,如:
1 Stud1 s1 1
3 Stud3 s2 1
2 Stud2 s1 2
4 Stud4 s2 2
5 Stud5 s2 3
6 Stud6 s2 4
7 Stud7 s2 5
8 Stud8 s2 6
9 Stud9 s2 7
因此,在选择top N
行时,由于该列的排序,它们会自动分发。