Sql 迭代表并对分区行执行操作?
我有一个包含以下记录的表:Sql 迭代表并对分区行执行操作?,sql,sql-server,Sql,Sql Server,我有一个包含以下记录的表: Id Partitioned SDDate 1 1 2014-01-01 2 2 2014-01-02 3 3 2014-01-03 4 4 2014-01-04 5 5 2014-01-05 6 6 2014-01-06 7 7 2014-01-07 8 1 2014-01-08 9 2 2014-01-09 10 3 2014-01-10 11 4 2014-01-11 12
Id Partitioned SDDate
1 1 2014-01-01
2 2 2014-01-02
3 3 2014-01-03
4 4 2014-01-04
5 5 2014-01-05
6 6 2014-01-06
7 7 2014-01-07
8 1 2014-01-08
9 2 2014-01-09
10 3 2014-01-10
11 4 2014-01-11
12 5 2014-01-12
13 6 2014-01-13
14 7 2014-01-14
15 1 2014-01-15
16 2 2014-01-16
Particion Dia: 1, Fecha: 2014-01-01, Horas extras: 3
Particion Dia: 2, Fecha: 2014-01-02, Horas extras: 3
Particion Dia: 3, Fecha: 2014-01-03, Horas extras: 3
Particion Dia: 4, Fecha: 2014-01-05, Horas extras: 1
Particion Dia: 5, Fecha: 2014-01-06, Horas extras: 3
Particion Dia: 6, Fecha: 2014-01-07, Horas extras: 3
Particion Dia: 7, Fecha: 2014-01-08, Horas extras: 3
Particion Dia: 1, Fecha: 2014-01-09, Horas extras: 3
Particion Dia: 2, Fecha: 2014-01-10, Horas extras: 3
Particion Dia: 3, Fecha: 2014-01-11, Horas extras: 3
Particion Dia: 4, Fecha: 2014-01-12, Horas extras: 3
Particion Dia: 5, Fecha: 2014-01-13, Horas extras: 3
Particion Dia: 6, Fecha: 2014-01-14, Horas extras: 3
Particion Dia: 7, Fecha: 2014-01-15, Horas extras: 3
Particion Dia: 1, Fecha: 2014-01-16, Horas extras: 3
正如您所看到的,记录是从1-7分区的,我想要实现的是将该组的记录插入临时表中。
当达到分区id的最大数目时,再次开始插入。
谢谢
我正在使用SQLServer2008RC2
代码如下:
Set NoCount On;
--
Declare
@InputTable As DT_HorasExtras
--
Insert Into @InputTable
( HorasExtra, Fecha )
Values
(3, '2014-01-01'),
(3, '2014-01-02'),
(1, '2014-01-03'),
(2, '2014-01-03'),
(1, '2014-01-05'),
(3, '2014-01-06'),
(3, '2014-01-07'),
(3, '2014-01-08'),
(3, '2014-01-09'),
(3, '2014-01-10'),
(3, '2014-01-11'),
(3, '2014-01-12'),
(3, '2014-01-13'),
(3, '2014-01-14'),
(3, '2014-01-15'),
(3, '2014-01-16')
Declare @Idx Int = 1, @InnerIncrementor Int = 1;
--
Declare
--
@PartitionedId Int,
@Fecha Date,
@HorasExtra Int,
@Id Int;
--
DECLARE IDs CURSOR LOCAL FOR
Select
t.Id
From utilsFilterAndPartitionHorasExtras(@InputTable) t
OPEN IDs
FETCH NEXT FROM IDs into @Id
WHILE @@FETCH_STATUS = 0
BEGIN
--
Select
@HorasExtra = t.HorasExtra,
@Fecha = t.Fecha,
@PartitionedId = t.Partitioned
From utilsFilterAndPartitionHorasExtras(@InputTable) t
Where t.Id = @Id
--
print 'Particion Dia: ' + Convert(varchar(max), @PartitionedId) + ', Fecha: ' + Convert(varchar(max), @Fecha) + ', Horas extras: ' + Convert(varchar(max), @HorasExtra);
--*** HERE I WANT TO INSERT RECORDS ONLY FROM PARTITION 1 TO 7
--*** WHEN 7 IS REACHED START INSERT AGAIN
insert into #tmpTable values(@Field1,.,,
-- inc
Set @Idx+=1;
FETCH NEXT FROM IDs into @Id
END
CLOSE IDs
DEALLOCATE IDs
这是输出:
Id Partitioned SDDate
1 1 2014-01-01
2 2 2014-01-02
3 3 2014-01-03
4 4 2014-01-04
5 5 2014-01-05
6 6 2014-01-06
7 7 2014-01-07
8 1 2014-01-08
9 2 2014-01-09
10 3 2014-01-10
11 4 2014-01-11
12 5 2014-01-12
13 6 2014-01-13
14 7 2014-01-14
15 1 2014-01-15
16 2 2014-01-16
Particion Dia: 1, Fecha: 2014-01-01, Horas extras: 3
Particion Dia: 2, Fecha: 2014-01-02, Horas extras: 3
Particion Dia: 3, Fecha: 2014-01-03, Horas extras: 3
Particion Dia: 4, Fecha: 2014-01-05, Horas extras: 1
Particion Dia: 5, Fecha: 2014-01-06, Horas extras: 3
Particion Dia: 6, Fecha: 2014-01-07, Horas extras: 3
Particion Dia: 7, Fecha: 2014-01-08, Horas extras: 3
Particion Dia: 1, Fecha: 2014-01-09, Horas extras: 3
Particion Dia: 2, Fecha: 2014-01-10, Horas extras: 3
Particion Dia: 3, Fecha: 2014-01-11, Horas extras: 3
Particion Dia: 4, Fecha: 2014-01-12, Horas extras: 3
Particion Dia: 5, Fecha: 2014-01-13, Horas extras: 3
Particion Dia: 6, Fecha: 2014-01-14, Horas extras: 3
Particion Dia: 7, Fecha: 2014-01-15, Horas extras: 3
Particion Dia: 1, Fecha: 2014-01-16, Horas extras: 3
如果要为这些行分配组id,则可以从id中减去分区:
select (partition - id) as grp, t.*
from table t
如果id
值实际上不一定是连续的,您可以为此使用行号()
select (row_number() over () order by (id, partition) - id) as grp, t.*
from table t
这将识别每个组。我不知道插入它们并重新开始是什么意思。您使用的是什么sql server,您尝试了什么?通过“迭代”,您可以让它听起来像您打算使用光标——这就是您想要的吗?请澄清:)你说的“重新开始插入”是什么意思?还有,你们用的是什么数据库?是的,我用了光标,也用了模运算符,但并没有成功。这对我来说很不清楚,你们想要一个temp表,每七个值有一行,值在不同的列中,还是其他什么?请为临时表添加预期结果。您可以使用递归CTE代替游标。此处您的要求不明确。比如为什么要在临时表中插入。当达到最大分区ID时,需要插入多长时间。我已经添加了代码,所以您可以验证我插入的意思