SQL - 自动分页目录

时间:2016-02-17 14:03:23

标签: sql sql-server logic

我正在构建一个模型,用产品自动填充(分页)目录。

我有一个正在运行的订单,每个产品应该收到的空间分配(1/8 1/4 1/2 3/4 1/1页)。

我需要有关如何将产品细分到页面上的想法。没有太多的空间浪费。

E.g。第1部分需要1/8页第2部分需要整页...正常逻辑会将第2部分放在下一页上。常识会将它们放在一起。 (这个例子会有很多变化)。

无法更改正在运行的订单。

由于

此处的数据样本:

CREATE TABLE #tt1 
  ( 
     productid        INT, 
     pages            DECIMAL(4, 2), 
     pagination_order INT 
  ) 

INSERT INTO #tt1 
SELECT 1006691, 
       0.125, 
       1 

INSERT INTO #tt1 
SELECT 1007836, 
       1, 
       2 

INSERT INTO #tt1 
SELECT 1005073, 
       0.125, 
       3 

INSERT INTO #tt1 
SELECT 1004985, 
       1, 
       4 

INSERT INTO #tt1 
SELECT 1007840, 
       0.5, 
       5 

INSERT INTO #tt1 
SELECT 1007841, 
       0.5, 
       6 

INSERT INTO #tt1 
SELECT 1008032, 
       1, 
       7 

INSERT INTO #tt1 
SELECT 1007845, 
       0.5, 
       8 

INSERT INTO #tt1 
SELECT 1006688, 
       0.25, 
       9 

INSERT INTO #tt1 
SELECT 1005890, 
       0.75, 
       10 

INSERT INTO #tt1 
SELECT 1006658, 
       0.5, 
       11 

INSERT INTO #tt1 
SELECT 1006654, 
       0.25, 
       12 

INSERT INTO #tt1 
SELECT 1006653, 
       0.5, 
       13 

INSERT INTO #tt1 
SELECT 1005066, 
       0.5, 
       14 

INSERT INTO #tt1 
SELECT 1006648, 
       0.25, 
       15 

INSERT INTO #tt1 
SELECT 1004970, 
       0.5, 
       16 

INSERT INTO #tt1 
SELECT 1004953, 
       0.25, 
       17 

INSERT INTO #tt1 
SELECT 1006024, 
       1, 
       18 

INSERT INTO #tt1 
SELECT 1007844, 
       0.5, 
       19 

INSERT INTO #tt1 
SELECT 1010035, 
       0.25, 
       20 

INSERT INTO #tt1 
SELECT 1010106, 
       0.25, 
       21 

INSERT INTO #tt1 
SELECT 1010036, 
       0.125, 
       22 

INSERT INTO #tt1 
SELECT 1010107, 
       0.25, 
       23 

INSERT INTO #tt1 
SELECT 1010004, 
       0.125, 
       24 

INSERT INTO #tt1 
SELECT 1010000, 
       0.5, 
       25 

INSERT INTO #tt1 
SELECT 1010003, 
       0.25, 
       26 

INSERT INTO #tt1 
SELECT 1007835, 
       0.25, 
       27 

INSERT INTO #tt1 
SELECT 1010116, 
       0.125, 
       28 

INSERT INTO #tt1 
SELECT 1010104, 
       0.25, 
       29 

INSERT INTO #tt1 
SELECT 1010033, 
       0.5, 
       30 

INSERT INTO #tt1 
SELECT 1010034, 
       0.5, 
       31 

INSERT INTO #tt1 
SELECT 1006590, 
       0.125, 
       32 

INSERT INTO #tt1 
SELECT 1008999, 
       0.25, 
       33 

INSERT INTO #tt1 
SELECT 1005080, 
       0.125, 
       34 

INSERT INTO #tt1 
SELECT 1006779, 
       0.5, 
       35 

INSERT INTO #tt1 
SELECT 1008989, 
       0.25, 
       36 

INSERT INTO #tt1 
SELECT 1005068, 
       0.5, 
       37 

INSERT INTO #tt1 
SELECT 1006650, 
       0.25, 
       38 

INSERT INTO #tt1 
SELECT 1005070, 
       0.5, 
       39 

INSERT INTO #tt1 
SELECT 1006693, 
       0.25, 
       40 

INSERT INTO #tt1 
SELECT 1007981, 
       0.25, 
       41 

INSERT INTO #tt1 
SELECT 1010022, 
       0.25, 
       42 

INSERT INTO #tt1 
SELECT 1009842, 
       0.5, 
       43 

INSERT INTO #tt1 
SELECT 1005069, 
       0.25, 
       44 

INSERT INTO #tt1 
SELECT 1000643, 
       0.25, 
       45 

INSERT INTO #tt1 
SELECT 1002611, 
       0.125, 
       46 

INSERT INTO #tt1 
SELECT 1000714, 
       1, 
       47 

INSERT INTO #tt1 
SELECT 1007983, 
       0.25, 
       48 

INSERT INTO #tt1 
SELECT 1006717, 
       0.25, 
       49 

INSERT INTO #tt1 
SELECT 1009846, 
       0.25, 
       50 

INSERT INTO #tt1 
SELECT 1009845, 
       0.25, 
       51 

INSERT INTO #tt1 
SELECT 1002559, 
       0.125, 
       52 

INSERT INTO #tt1 
SELECT 1010006, 
       0.25, 
       53 

INSERT INTO #tt1 
SELECT 1006742, 
       0.5, 
       54 

INSERT INTO #tt1 
SELECT 1004952, 
       1, 
       55 

INSERT INTO #tt1 
SELECT 1009855, 
       0.5, 
       56 

INSERT INTO #tt1 
SELECT 1009876, 
       0.75, 
       57 

INSERT INTO #tt1 
SELECT 1000556, 
       0.25, 
       58 

INSERT INTO #tt1 
SELECT 1010085, 
       0.125, 
       59 

INSERT INTO #tt1 
SELECT 1010086, 
       0.125, 
       60 

INSERT INTO #tt1 
SELECT 1000888, 
       0.125, 
       61 

INSERT INTO #tt1 
SELECT 1000672, 
       0.125, 
       62 

INSERT INTO #tt1 
SELECT 1010077, 
       0.125, 
       63 

INSERT INTO #tt1 
SELECT 1000550, 
       0.125, 
       64 

INSERT INTO #tt1 
SELECT 1000551, 
       0.125, 
       65 

INSERT INTO #tt1 
SELECT 1002409, 
       0.125, 
       66 

INSERT INTO #tt1 
SELECT 1002402, 
       0.25, 
       67 

INSERT INTO #tt1 
SELECT 1005870, 
       0.25, 
       68 

INSERT INTO #tt1 
SELECT 1006594, 
       0.125, 
       69 

INSERT INTO #tt1 
SELECT 1002494, 
       1, 
       70 

INSERT INTO #tt1 
SELECT 1002307, 
       0.125, 
       71 

INSERT INTO #tt1 
SELECT 1000662, 
       0.5, 
       72 

INSERT INTO #tt1 
SELECT 1002587, 
       0.25, 
       73 

INSERT INTO #tt1 
SELECT 1002563, 
       0.25, 
       74 

INSERT INTO #tt1 
SELECT 1000703, 
       0.5, 
       75 

INSERT INTO #tt1 
SELECT 1009404, 
       0.25, 
       76 

INSERT INTO #tt1 
SELECT 1000975, 
       0.25, 
       77 

INSERT INTO #tt1 
SELECT 1002562, 
       0.125, 
       78 

INSERT INTO #tt1 
SELECT 1000645, 
       1, 
       79 

INSERT INTO #tt1 
SELECT 1007980, 
       0.125, 
       80 

INSERT INTO #tt1 
SELECT 1002225, 
       0.25, 
       81 

INSERT INTO #tt1 
SELECT 1005092, 
       0.25, 
       82 

INSERT INTO #tt1 
SELECT 1009840, 
       0.25, 
       83 

INSERT INTO #tt1 
SELECT 1006649, 
       0.25, 
       84 

INSERT INTO #tt1 
SELECT 1004959, 
       0.25, 
       85 

INSERT INTO #tt1 
SELECT 1000604, 
       0.25, 
       86 

INSERT INTO #tt1 
SELECT 1005021, 
       0.25, 
       87 

INSERT INTO #tt1 
SELECT 1007846, 
       0.75, 
       88 

INSERT INTO #tt1 
SELECT 1002519, 
       0.125, 
       89 

INSERT INTO #tt1 
SELECT 1006675, 
       0.125, 
       90 

INSERT INTO #tt1 
SELECT 1000541, 
       0.125, 
       91 

INSERT INTO #tt1 
SELECT 1006676, 
       0.125, 
       92 

INSERT INTO #tt1 
SELECT 1006784, 
       0.125, 
       93 

INSERT INTO #tt1 
SELECT 1002357, 
       0.25, 
       94 

INSERT INTO #tt1 
SELECT 1002355, 
       0.5, 
       95 

INSERT INTO #tt1 
SELECT 1009841, 
       0.25, 
       96 

INSERT INTO #tt1 
SELECT 1009858, 
       0.125, 
       97 

INSERT INTO #tt1 
SELECT 1005866, 
       0.25, 
       98 

INSERT INTO #tt1 
SELECT 1005878, 
       0.125, 
       99 

INSERT INTO #tt1 
SELECT 1004962, 
       0.125, 
       100 

INSERT INTO #tt1 
SELECT 1006768, 
       0.25, 
       101 

INSERT INTO #tt1 
SELECT 1000704, 
       0.125, 
       102 

INSERT INTO #tt1 
SELECT 1000589, 
       0.125, 
       103 

INSERT INTO #tt1 
SELECT 1002276, 
       0.125, 
       104 

INSERT INTO #tt1 
SELECT 1000940, 
       0.125, 
       105 

INSERT INTO #tt1 
SELECT 1000648, 
       0.25, 
       106 

INSERT INTO #tt1 
SELECT 1000588, 
       0.25, 
       107 

INSERT INTO #tt1 
SELECT 1002560, 
       0.125, 
       108 

INSERT INTO #tt1 
SELECT 1001655, 
       0.5, 
       109 

INSERT INTO #tt1 
SELECT 1002580, 
       0.25, 
       110 

INSERT INTO #tt1 
SELECT 1004961, 
       0.125, 
       111 

INSERT INTO #tt1 
SELECT 1004986, 
       0.125, 
       112 

INSERT INTO #tt1 
SELECT 1002312, 
       0.125, 
       113 

INSERT INTO #tt1 
SELECT 1004918, 
       0.125, 
       114 

INSERT INTO #tt1 
SELECT 1000706, 
       0.5, 
       115 

INSERT INTO #tt1 
SELECT 1004958, 
       0.125, 
       116 

INSERT INTO #tt1 
SELECT 1002315, 
       0.5, 
       117 

INSERT INTO #tt1 
SELECT 1003026, 
       0.25, 
       118 

INSERT INTO #tt1 
SELECT 1010083, 
       0.125, 
       119 

INSERT INTO #tt1 
SELECT 1007902, 
       0.25, 
       120 

INSERT INTO #tt1 
SELECT 1010082, 
       0.125, 
       121 

INSERT INTO #tt1 
SELECT 1006620, 
       0.25, 
       122 

INSERT INTO #tt1 
SELECT 1007867, 
       0.125, 
       123 

INSERT INTO #tt1 
SELECT 1006740, 
       0.25, 
       124 

INSERT INTO #tt1 
SELECT 1007939, 
       0.125, 
       125 

INSERT INTO #tt1 
SELECT 1006642, 
       0.125, 
       126 

INSERT INTO #tt1 
SELECT 1006641, 
       0.125, 
       127 

INSERT INTO #tt1 
SELECT 1007938, 
       0.25, 
       128 

INSERT INTO #tt1 
SELECT 1010046, 
       0.25, 
       129 

INSERT INTO #tt1 
SELECT 1003014, 
       0.25, 
       130 

INSERT INTO #tt1 
SELECT 1003041, 
       0.125, 
       131 

INSERT INTO #tt1 
SELECT 1007866, 
       0.125, 
       132 

INSERT INTO #tt1 
SELECT 1003035, 
       0.125, 
       133 

INSERT INTO #tt1 
SELECT 1000857, 
       0.125, 
       134 

INSERT INTO #tt1 
SELECT 1000852, 
       0.125, 
       135 

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么我认为这会给你你想要的东西:

;WITH MyCTE AS
(
SELECT
    productid,
    pages,
    SUM(pages) OVER (ORDER BY pagination_order) AS current_page_unrounded
FROM
    #tt1
)
SELECT
    productid,
    pages,
    CEILING(current_page_unrounded) AS page_number
FROM
    MyCTE

SUM的窗口使用可让您获得总计,然后您只需使用CEILING向上舍入到产品出现的页码。

请注意,这将不惜一切代价保留分页顺序,因此不会对页面进行适当的优化。