通过SQL简化长数据表到视图中

时间:2013-09-09 22:45:30

标签: sql sql-server

我正在寻找创建特殊视图的解决方案但却不知道如何解决它。 :(

我尽力让它变得清晰。 为了更好地再现一次图解和脚本。

数据结构:

数据库是Azure数据库(我认为它是SQL Server 2005) 我有下表。 (请不要批评结构,它是给予而不是来自我)

CREATE TABLE [dbo].[DeviceData](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[DeviceID] [bigint] NOT NULL,
[TimeStamp] [datetime] NOT NULL,
[Error] [nvarchar](50) NULL,
CONSTRAINT [PrimaryKey_e149e28f-5754-4889-be01-65fafeebce16] PRIMARY KEY CLUSTERED 
(
 [DeviceID] ASC,
 [TimeStamp] ASC
))

-

DeviceData
-------------------------
ID (identity)  | Int
DeviceID (PK)  | Int
TimeStamp (PK) | DateTime
Error          | String

样本数据:

INSERT INTO [dbo].[DeviceData]
       ([DeviceID]
       ,[TimeStamp]
       ,[Error])
 VALUES
       (
         (1, '2013.01.01 10:00:00', "Error 1"),
         (2, '2013.01.01 10:00:00', "Error 1"),
         (3, '2013.01.01 10:00:00', "Error 1"),
         (1, '2013.01.01 10:01:00', "Error 1"),
         (2, '2013.01.01 10:01:00', null),
         (1, '2013.01.01 10:02:00', "Error 2"),
         (3, '2013.01.01 10:30:00', null)
       )

-

ID | DeviceID  | TimeStamp           | Error
-------------------------------------------------------------
1  | 1         | 2013.01.01 10:00:00 | Error 1
2  | 2         | 2013.01.01 10:00:00 | Error 1
3  | 3         | 2013.01.01 10:00:00 | Error 1
4  | 1         | 2013.01.01 10:01:00 | Error 1
5  | 2         | 2013.01.01 10:01:00 | null
6  | 1         | 2013.01.01 10:02:00 | Error 2
7  | 3         | 2013.01.01 10:30:00 | null

想要结果

我现在想要按设备分组数据,并在[错误]字段上分组“子组”。

我不知道如何用文字来描述它,所以请查看示例结果。

DeviceID  | Begin               | End                 | Error
---------------------------------------------------------------
1         | 2013.01.01 10:00:00 | 2013.01.01 10:02:00 | Error 1
2         | 2013.01.01 10:00:00 | 2013.01.01 10:01:00 | Error 1
1         | 2013.01.01 10:02:00 | 2013.01.01 10:02:00 | Error 2
3         | 2013.01.01 10:00:00 | 2013.01.01 10:30:00 | Error 1

如果有人能给我一个如何以最有效的方式解决我的观点的提示,那将是非常好的。

来自德国的问候和感谢 斯特芬

1 个答案:

答案 0 :(得分:0)

我们可能需要完成这个工作,因为我在这里仍然缺少一些逻辑。

select deviceid ,min(timestamp) as begin, max(timestamp) as end, error
from devicedata
group by deviceid,error

这将返回接近你想要的结果,但它不会将空错误与错误1分组。这就是你在这里面对的'snafu'......它是如何处理这些空值并将它们与适当的错误。是否有可能第8行存在:

8  | 1         | 2013.01.01 11:30:00 | null

如果发生这种情况,你怎么知道null与哪个记录有关?