2009-12-09 51 views
0

我们正在寻找许多测试表。除了时间戳列以外,所有数据都可以相同。该行中的其他列包含复杂的数据,如xml格式的对象和其他杂乱的东西,所以我们不希望重新制作它。 通过sql查询,通过以恒定的间隔递增时间戳,将单个条目扩展为数千个简单的方法是什么?什么是通过单个条目的sql查询填充数据库的简单方法?

我们目前的想法(在C-ISH伪代码)是:

Get the latest (likely only) row and store it in a variable "thisRow" 
While(thisRow->time < endTime) 
{ 
Increment thisRow->time by a constant variable 
Insert thisRow 
} 

我们正在使用的Postgres

+2

请说出您正在使用的数据库(Oracle,MSSQL,mysql等)。 – 2009-12-09 18:31:47

+0

您正在使用哪个数据库? – 2009-12-09 18:32:21

回答

2

我喜欢保持Numbers表格在我的数据库中的某些查询。如果你有一个,那么你可以使用下面的单个语句。如果你没有一个,很容易生成一个作为临时表或永久表。

INSERT INTO Test_Table 
(
    col1, 
    col2, 
    ..., 
    my_timestamp 
) 
SELECT 
    ST.col1, 
    ST.col2, 
    ..., 
    DATEADD(mi, N.number, ST.my_timestamp) 
FROM 
    Source_Table ST 
INNER JOIN Numbers N ON 
    N.number BETWEEN 1 AND 1000 -- Change this to what you want 

这是针对SQL Server的。 DATEADD函数在您的RDBMS中可能会有所不同。如果你不希望间隔时间恰好是一分钟,你也可以添加一个随机函数,当然你也可以将间隔时间改为几小时,几天或其他。如果你想说每间隔两小时,你也可以使用一个简单的公式。

+0

要添加两个postgres特定技巧: DATEADD ...可以替换为 ST.timetag + CAST(textcat(text(number),text('minutes'))as interval, 和Numbers表的东西可以使用generateSeries()like FROM Source_Table ST generate_series(1,10000)as number – Adam 2009-12-11 16:05:14

2

使用SQL Server 2005 +,您可以利用CTE语句看一看这个

DECLARE @StartTime DATETIME, 
     @EndTime DATETIME 

SELECT @StartTime = '01 Jan 2009', 
     @EndTime = '31 Jan 2009' 

DECLARE @Table TABLE(
     DateVal DATETIME, 
     Col1 INT 
) 

INSERT INTO @Table SELECT @StartTime, 1 

SELECT * 
FROM @Table 

;WITH CTE AS (
     SELECT @StartTime StartTime 
     UNION ALL 
     SELECT DATEADD(dd, 1, StartTime) StartTime 
     FROM CTE 
     WHERE StartTime < @EndTime 
) 
SELECT CTE.*, 
     t.Col1 
FROM CTE, 
     @Table t 
1

如果您使用的是支持递归的数据库,例如Microsoft SQL Server的,你可以使用类似于:

WITH T AS (
    SELECT 1 AS r 
    UNION ALL 
    SELECT r + 1 AS r 
    FROM T 
    WHERE r < 100 -- Or however many rows you need 
) 
INSERT INTO TestTable (Col1, Col2,...) 
SELECT s.Col1, s.Col2,... 
FROM SourceTable s 
    CROSS JOIN T 
+0

实际上,您只能执行100个递归级别。 – 2009-12-09 19:32:13

+0

你可以做的比这更多......这只是默认限制。将OPTION(MAXRECURSION 0)添加到最后。 – Paul 2009-12-10 11:26:08

相关问题