2010-10-08 54 views
2

我想在一个记录中插入一个page_number,该记录可以基于列中的重复进行连续计数。示例输出:如何在当前已订购的重复记录上添加行号列

ID  PAGE_ORDER PAGE_NUMBER 
1   7   1 
2   7   1 
3   7   1 
4   7   1 
5   7   1 
6   10   2 
7   10   2 
8   10   2 
9   10   2 
10   10   2 
11   13   3 
12   13   3 
13   13   3 
14   13   3 
15   13   3 
16   9   4 
17   9   4 
18   9   4 
19   9   4 
20   9   4 
21   16   5 
22   16   5 
23   16   5 
24   16   5 
25   16   5 
26   11   6 
27   11   6 
28   11   6 
29   11   6 
30   11   6 
31   12   7 
32   12   7 
33   12   7 
34   12   7 
35   12   7 
36   4   8 
37   4   8 
38   4   8 
39   4   8 
40   4   8 
41   5   9 
42   5   9 
43   5   9 
44   5   9 
45   5   9 
46   14   10 
47   14   10 
48   14   10 
49   14   10 
50   14   10 
51   15   11 
52   15   11 
53   15   11 
54   15   11 
55   15   11 
56   6   12 
57   6   12 
58   6   12 
59   6   12 
60   6   12 
61   1   13 
62   1   13 
63   1   13 
64   1   13 
65   1   13 
66   2   14 
67   2   14 
68   2   14 
69   2   14 
70   2   14 
71   8   15 
72   8   15 
73   8   15 
74   8   15 
75   8   15 
76   3   16 
77   3   16 
78   3   16 
79   3   16 
80   3   16 

如何在输出中添加page_number列? page_number列的规则是基于page_order列中的重复记录连续计数。 请指教。谢谢。

+0

我不清楚,如果你只是想在输出中的'page_number',或实际存储在表中? – 2010-10-08 14:26:53

+0

我只是想在输出中添加page_number。 page_number列的规则是基于page_order列中的重复记录连续计数。谢谢。 – jeff 2010-10-08 15:07:13

+0

然后请纠正你的例子,这很明显。目前,您的'page_order'值为4,其page_number值为2,但有更多重复值为6和3. – 2010-10-08 15:29:53

回答

0

我不太确定您的数据是如何订购的 - 似乎有很多重复,没有特定的顺序。

但是,如果你的SQL Server 2005或2008年,您的解决方案可能会涉及RANK

http://msdn.microsoft.com/en-us/library/ms176102.aspx

+0

对不起,我更新了这个问题。 page_number列的规则是基于page_order列中的重复记录连续计数谢谢。 – jeff 2010-10-08 15:11:24

+0

它必须是DENSE_RANK。 RANK会将组中的记录数添加到下一个等级编号 – 2010-10-09 02:43:29

0

我在做什么用的ID柱确实有点不清楚,因为它总是相同的值,但是这应该给你你想要给你提供的数据输出:

WITH Results AS (
    SELECT 
     MAX(ID) as ID, 
     Page_Order, 
     ROW_NUMBER() OVER (ORDER BY Page_Order DESC) as Page_Number 
    FROM 
     PageNumberTable 
    GROUP BY 
     Page_Order 

) 
SELECT 
    Results.* 
FROM 
    PageNumberTable 
    JOIN Results ON PageNumberTable.Page_Order = Results.Page_Order 
+0

ROW_NUMBER会为每一行提供唯一值 - 它永远不会返回重复项。如果你想重复,你需要使用RANK(它仍然会增加取决于结果数量的值)或DENSE_RANK。 – 2010-10-08 14:25:33

+0

@OMG小马,我的意思是没有不敬,但你*尝试*我的代码?我*知道* ROW_NUMBER给出了唯一的值,因此CTE +加入。 :) – 2010-10-08 14:29:43

+0

我得到'无法找到存储过程的结果'。自连接不改变编号的事实。 – 2010-10-08 14:35:47

0

试试这个

SELECT id, page_order, 
     DENSE_RANK() OVER(ORDER BY 
      (MIN(id) OVER(PARTITION BY page_order)) as page_number 
FROM table_name 
ORDER BY id 

编辑:试试这个,而不是

;WITH T1 AS 
(
    SELECT id, page_order, MIN(id) OVER(PARTITION BY page_order) AS min_id 
) 
SELECT id, page_order, DENSE_RANK() OVER(ORDER BY min_id) AS page_number 
FROM T1 
ORDER BY id 
+0

此查询给我一个错误“窗口函数不能用于另一个窗口函数或聚合的上下文中。” – jeff 2010-10-10 01:14:52

+0

我在我的问题中找到了解决方案:select *,dense_rank()over(order by sort) from(select *,sort = min(ID)over(partition by page_row) from #temp_hist)c order by c。 ID – jeff 2010-10-10 11:56:35

+0

@jeff:看我的编辑。对不起,我没有测试我的第一个解决方案 – 2010-10-11 06:16:00