如何“规范化”查询结果

时间:2016-09-05 09:13:44

标签: sql sql-server tsql

我有一个表格,显示每个时间戳的不同值。每次值发生变化时,都会在表格中插入一条线(如温度计控制器)。

显示记录只会产生更改和时间戳。我的问题是我需要每分钟左右显示结果,即使该值根本没有变化。并且没有在表格中插入“空白”线条。

我尝试右键加入我的表格,其中的视图显示了同一日期的所有getdate()戳记,但我无法使查询生效。

05 Sep 2016 09:50:24    20
05 Sep 2016 09:56:14    18

应该是

05 Sep 2016 09:50:24    20
05 Sep 2016 09:51:24    20
05 Sep 2016 09:52:24    20
05 Sep 2016 09:53:24    20
05 Sep 2016 09:54:24    20
05 Sep 2016 09:55:24    20
05 Sep 2016 09:56:14    18
05 Sep 2016 09:57:24    18
.
.

1 个答案:

答案 0 :(得分:2)

您需要使用递归CTE。我假设对于日期时间列调用ChangedDate,对于问题第二列中的任何值调用SomeValue

;WITH cte AS (
SELECT  t.ChangedDate,
        t.SomeValue,
        p.ChangedDate as NextDate
FROM YourTable t
OUTER APPLY (
    SELECT top 1 *
    FROM YourTable
    WHERE t.ChangedDate <ChangedDate
    ORDER BY ChangedDate
    ) p
UNION ALL
SELECT  DATEADD(minute,1,ChangedDate),
        SomeValue,
        NextDate
FROM cte
WHERE DATEADD(minute,1,ChangedDate) < NextDate
)

SELECT  ChangedDate,
        SomeValue
FROM cte
ORDER BY ChangedDate
OPTION (MAXRECURSION 0)

对于您的样本,它将输出:

ChangedDate             SomeValue
2016-09-05 09:50:24.000 20
2016-09-05 09:51:24.000 20
2016-09-05 09:52:24.000 20
2016-09-05 09:53:24.000 20
2016-09-05 09:54:24.000 20
2016-09-05 09:55:24.000 20
2016-09-05 09:56:14.000 18

如果再添加一个字符串('2016-09-05 10:00:34', 17),则会输出:

ChangedDate             SomeValue
2016-09-05 09:50:24.000 20
2016-09-05 09:51:24.000 20
2016-09-05 09:52:24.000 20
2016-09-05 09:53:24.000 20
2016-09-05 09:54:24.000 20
2016-09-05 09:55:24.000 20
2016-09-05 09:56:14.000 18
2016-09-05 09:57:14.000 18
2016-09-05 09:58:14.000 18
2016-09-05 09:59:14.000 18
2016-09-05 10:00:14.000 18
2016-09-05 10:00:34.000 17

如果您需要此日志持续到当前时间更改此部分:

p.ChangedDate as NextDate
在CTE中

COALESCE(p.ChangedDate,GETDATE()) as NextDate