1

我目前有以下结果集:

WEEKDAY     INITIAL_MIN       ENDING_MIN
----------- ----------------- -----------------
7           0                 150 
7           360               480
7           980               1310
6           200               300

此数据获取工作日(从 1 到 7)和不可用的工作时间(以分钟为单位,因此 0 是 00:00,1439 是 23:59),由于数据库限制,我无法更改其格式/数据类型

我需要在另一个表上插入每个工作日的补充数据,所以在这个例子中它将是:

WEEKDAY     INITIAL_MIN       ENDING_MIN
----------- ----------------- -----------------
7           151               359
7           481               979
7           1311              1439
6           0                 199
6           301               1439
5           0                 1439
4           0                 1439
3           0                 1439
2           0                 1439
1           0                 1439

我的限制:

  • 那是一个 SQL Server 2005 数据库
  • 我无法创建 TV/Scalar 函数(只是程序)
4

1 回答 1

0

这是一种可能的解决方案(假设您的初始结果集是@tmp):

首先,我必须为我的最终设置准备好结果集SELECT

如果一天的第一条记录不是从 0 开始,我会添加一个占位符记录,其中 INITIAL_MIN = -1,ENDING_MIN = -1。我的最终选择现在将找到占位符和当天第一行之间的范围。

INSERT INTO @tmp
SELECT WEEKDAY, -1, -1
FROM @tmp 
WHERE WEEKDAY NOT IN (SELECT WEEKDAY FROM @tmp WHERE INITIAL_MIN <= 0)

下一个查询计算出所有丢失的时间范围 - 它将它们存储在一个临时表中,因此如果它已经存在,则必须首先删除它。

IF OBJECT_ID('tempdb..#result') IS NOT NULL
    DROP TABLE #result

SELECT t1.WEEKDAY
    ,INITIAL_MIN = ISNULL(t1.ENDING_MIN+1, 0)
    ,ENDING_MIN = ISNULL(t2.INITIAL_MIN-1, 1439)
INTO #result
FROM (
    SELECT *
        ,rn = ROW_NUMBER() OVER (PARTITION BY WEEKDAY ORDER BY INITIAL_MIN DESC) 
    FROM @tmp t
    WHERE ENDING_MIN < 1439
) t1 
LEFT JOIN (
    SELECT *
        ,rn = ROW_NUMBER() OVER (PARTITION BY WEEKDAY ORDER BY INITIAL_MIN DESC) 
    FROM @tmp t
) t2 ON t1.WEEKDAY = t2.WEEKDAY AND t2.rn = t1.rn-1
ORDER BY WEEKDAY, INITIAL_MIN

添加根本不在原始结果中的日期:

DECLARE @wkday TINYINT = 1
WHILE @wkday <= 7
BEGIN
    IF NOT EXISTS(SELECT 1 FROM @tmp WHERE WEEKDAY = @wkday)
    INSERT INTO #result 
    VALUES( @wkday, 0, 1439)

    SET @wkday = @wkday + 1
END  

最后只需从临时表中选择数据

SELECT * FROM #result

输出:

WEEKDAY INITIAL_MIN ENDING_MIN
------- ----------- -----------
1       0           1439
2       0           1439
3       0           1439
4       0           1439
5       0           1439
6       0           199
6       301         1439
7       151         359
7       481         979
7       1311        1439
于 2013-11-13T11:13:21.820 回答