在SQL中分组或迭代分区

时间:2013-05-21 00:11:06

标签: sql-server tsql partitioning

关于SQL中的分区的两部分问题。

在T-SQL中,当你使用PARTITION BY时,有没有办法为每个分区分配一个唯一的编号,除了像row_number()这样的东西?

E.g。 row_number()会产生,

Action          Timestamp           RowNum
A               '2013-1-10'         1
A               '2013-1-11'         2
B               '2013-1-12'         1
B               '2013-1-13'         2

然而,此外,唯一标识每个分区可以产生,

Action          Timestamp           RowNum          PartitionNum
A               '2013-1-10'         1               1
A               '2013-1-11'         2               1
B               '2013-1-12'         1               2
B               '2013-1-13'         2               2

然后可以使用GROUP BY分区号。

我的问题的第二部分是,你如何打破每个分区并迭代它,例如,

for each partition p
   for each row r in p 
       do F(r) 

T-SQL中的任何方式?

1 个答案:

答案 0 :(得分:2)

您可以使用dense_rank()

select  *
,       row_number() over (partition by Action order by Timestamp) as RowNum
,       dense_rank() over (order by Action) as PartitionNum
from    YourTable

Example at SQL Fiddle.

T-SQL不擅长迭代,但如果你真的需要,请查看cursors