sql—查询,将表按节排序,并从中间向外填充节

gudnpqoy  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(248)

我有一张空位表,从1号到15号。这些插槽逻辑上分为3个部分,每个部分有5个插槽。我想把它们分成几个部分,中间的部分先填好,然后移到边缘,这样每个部分的第一个和最后一个部分最后填好。如果一张table看起来像这样:
原始表中的插槽(|表示段之间的边界)

| 1,2,3,4,5 | 6,7,8,9,10 | 11,12,13,14,15|

我想运行一个查询,它将返回这样的结果:每个段首先列出中间的槽,然后是中间旁边的槽,然后是每个段末尾的槽。

| 3,4,2,5,1 | 8,9,7,10,6 | 13,14,12,15,11 |

这在sql中是可能的吗?
我试过这样的方法,但效果不太好:

DECLARE @SegSize INT = 5;

DECLARE @NoSeg INT = 3;

SELECT SlotLoc
FROM Slots
ORDER BY ABS((SlotLoc%@SegSize)-CEILING(@SegSize/2 + 1))
col17t5w

col17t5w1#

这取决于许多假设,比如固定的行数,还假设您不关心插槽2/3和4/5的顺序。根据这些数据:

CREATE TABLE #slots(slot tinyint);

INSERT #slots(slot) SELECT TOP (15) 
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
  FROM sys.all_objects;

这个查询非常接近您想要的输出(除了有时先列出较高的slot值,有时最后列出):

;WITH x AS 
(
  SELECT slot, segment = (ROW_NUMBER() OVER (ORDER BY slot)-1)/5 FROM #slots
),
y AS 
(
  SELECT slot,segment,
    rn = ABS(3 - ROW_NUMBER() OVER (PARTITION BY segment ORDER BY slot)) 
  FROM x
)
SELECT slot FROM y ORDER BY segment, rn;

结果:

Slot
----
3
4
2
1
5
8
9
7
10
6
13
14
12
15
11

清理:

DROP TABLE #slots;

相关问题