在SQL中按行分配行号,每行编号n行

时间:2014-08-08 13:26:40

标签: sql tsql

我正在尝试使用以下SQL生成每个订单号每页3行的报告。 从结果中可以看出字段Actual&预期不符合。

任何帮助都将不胜感激。

set nocount on
DECLARE @Orders TABLE (Expected int, OrderNumber INT, OrderDetailsNumber int)
Insert into @orders  values (0,1,1)
Insert into @orders  values (0,1,2)
Insert into @orders  values (0,1,3)
Insert into @orders  values (1,1,4)
Insert into @orders  values (2,2,5)
Insert into @orders  values (2,2,6)
Insert into @orders  values (2,2,7)
Insert into @orders  values (3,2,8)
Insert into @orders  values (3,2,9)

select cast(((row_number() over( order by OrderNumber)) -1) /3 as int) as [Actual]
        ,* 
from @orders


Actual      Expected    OrderNumber OrderDetailsNumber
----------- ----------- ----------- ------------------
0           0           1           1
0           0           1           2
0           0           1           3
1           1           1           4
1           2           2           5
1           2           2           6
2           2           2           7
2           3           2           8
2           3           2           9

2 个答案:

答案 0 :(得分:0)

是的,经过几次编辑,我得到了最终答案:

 SELECT     DENSE_RANK() OVER (Order BY OrderNumber, floor(RowNumber/3)) - 1 AS Actual,
            Expected,
            OrderNumber,
            OrderDetailsNumber
 FROM
 (
 SELECT     *,
            ROW_NUMBER() OVER   (
                        PARTITION BY    OrderNumber 
                        ORDER BY        OrderDetailsNumber
                        ) - 1 AS RowNumber
 FROM       @Orders
 ) RowNumberTable

给出结果(带有额外的行进行测试):

Actual               Expected    OrderNumber OrderDetailsNumber
-------------------- ----------- ----------- ------------------
0                           0             1             1
0                           0             1             2
0                           0             1             3
1                           1             1             4
1                           1             1             12
2                           2             2             5
2                           2             2             6
2                           2             2             7
3                           3             2             8
3                           3             2             9
3                           4             2             11
4                           3             2             27
5                           5             3             10

这仅适用于OrderDetailsNumber是唯一的,因此结果是确定性的。

修改

我现在已经完成了完整的代码,但是对OrderDetailsNumber的依赖是非常不确定的,希望你可以根据需要进行测试和编辑。

编辑2

我已经把高尔夫球打成了高尔夫'主要答案中的版本。

WITH FirstCTE AS
(
    SELECT 
    OrderNumber, 
    OrderDetailsNumber, 
    Expected,
    ROW_NUMBER() OVER   (
                        PARTITION BY    OrderNumber 
                        ORDER BY        OrderDetailsNumber
                        ) - 1 AS RowNumber
    FROM @Orders
)
, SecondCTE AS
(
    SELECT OrderDetailsNumber as odn,
    floor(RowNumber/3) as page_for_order_number,
    DENSE_RANK() OVER (Order BY OrderNumber, floor(RowNumber/3)) - 1 AS Actual

 FROM FirstCTE
)
SELECT  c2.page_for_order_number,
        c1.RowNumber,
        C2.Actual,
        c1.Expected,
        c1.OrderNumber,
        c1.OrderDetailsNumber
 FROM   FirstCTE AS c1
 INNER JOIN SecondCTE AS c2
 on     c2.odn = c1.OrderDetailsNumber

答案 1 :(得分:0)

这让我觉得有点像黑客,但它有效...... 将row_number()除以3,并使用CEILING得到大于或等于该除法结果的最小整数。

select row_number() over( order by OrderNumber) as [Actual],
cast (row_number() over(order by ordernumber) as decimal(5,1)) / 3,
CEILING(cast (row_number() over(order by ordernumber) as decimal(5,1)) / 3)as GRPR,
        * 
from @orders
编辑:打它,永远不会得到结果排队。结果集中的第3列是您的“页码”。 产量:

Actual  (No column name)    PG_NBR Expected OrderNumber OrderDetailsNumber
1   0.333333    1   0   1   1
2   0.666666    1   0   1   2
3   1.000000    1   0   1   3
4   1.333333    2   1   1   4
5   1.666666    2   2   2   5
6   2.000000    2   2   2   6
7   2.333333    3   2   2   7
8   2.666666    3   3   2   8
9   3.000000    3   3   2   9