Ordre par paires de valeurs

J'ai un set de classments, classés par groupe et classment:

Group | Rank ------------ A | 1 A | 2 A | 3 A | 4 A | 5 A | 6 B | 1 B | 2 B | 3 B | 4 C | 1 C | 2 C | 3 C | 4 C | 5 D | 1 D | 2 D | 3 D | 4 

Je veux entrelacer les groupes, classés par groupe et rang, n classments par groupe à la fois (ici, n = 2):

 Group | Rank ------------ A | 1 A | 2 B | 1 B | 2 C | 1 C | 2 D | 1 D | 2 A | 3 A | 4 B | 3 B | 4 C | 3 C | 4 D | 3 D | 4 A | 5 A | 6 C | 5 

J'ai atteint le résultat désiré avec des loops et des variables de table (code collé ici parce que j'ai une erreur de syntaxe non-descript dans un fiddle SQL):

 CREATE TABLE Rankings([Group] NCHAR(1), [Rank] INT) INSERT Rankings VALUES ('A',1), ('A',2), ('A',3), ('A',4), ('A',5), ('A',6), ('B',1), ('B',2), ('B',3), ('B',4), ('C',1), ('C',2), ('C',3), ('C',4), ('C',5), ('D',1), ('D',2), ('D',3), ('D',4) -- input DECLARE @n INT = 2 --number of group rankings per rotation -- output DECLARE @OrderedRankings TABLE([Group] NCHAR(1), Rank INT) -- -- in-memory rankings.. we will be deleting used rows DECLARE @RankingsTemp TABLE(GroupIndex INT, [Group] NCHAR(1), Rank INT) INSERT @RankingsTemp SELECT ROW_NUMBER() OVER (PARTITION BY Rank ORDER BY [Group]) - 1 AS GroupIndex, [Group], Rank FROM Rankings ORDER BY [Group], Rank -- loop variables DECLARE @MaxGroupIndex INT = (SELECT MAX(GroupIndex) FROM @RankingsTemp) DECLARE @RankingCount INT = (SELECT COUNT(*) FROM @RankingsTemp) DECLARE @i INT WHILE(@RankingCount > 0) BEGIN SET @i = 0; WHILE(@i <= @MaxGroupIndex) BEGIN INSERT INTO @OrderedRankings ([Group], Rank) SELECT TOP(@n) [Group], Rank FROM @RankingsTemp WHERE GroupIndex = @i; WITH T AS ( SELECT TOP(@n) * FROM @RankingsTemp WHERE GroupIndex = @i ); DELETE FROM T SET @i = @i + 1; END SET @RankingCount = (SELECT COUNT(*) FROM @RankingsTemp) END SELECT @RankingCount as RankingCount, @MaxGroupIndex as MaxGroupIndex -- view results SELECT * FROM @OrderedRankings 

Comment puis-je get l'ordre souhaité avec une approche basée sur un set (pas de loops, pas de variables de table)?

J'utilise SQL Server Enterprise 2008 R2.

Edit: Pour clarifier, je n'ai pas besoin de plus de n lignes par groupe pour apparaître de manière contiguë. Le but de cette requête est de donner un ordre, lorsqu'il est lu séquentiellement, offre une représentation égale (n rangées à la fois) de chaque groupe, par rapport au rang.

Peut-être quelque chose comme ça … SQL FIDDLE

 Order by Ceiling(rank*1.0/2), group, rank 

Travail du violon ci-dessus (les noms de colonnes ont légèrement changé)

Mise à jour: a été brûlé par int math …. devrait travailler maintenant. forcer int à décimale en multipliant par 1.0 de sorte que le casting implicite ne laisse pas tomber le rest dont j'ai besoin pour que le plafond tourne correctement.

En supposant que vous avez un nombre relativement faible de rangs, cela fonctionnerait:

 Order by case when rank <= n then 10 when rank <= 2*n then 20 when rank <= 3*n then 30 when rank <= 4*n then 40 when rank <= 5*n then 50 --more cases here if needed else 100 end , group , rank