我在编写查询以获得我想要的结果时遇到了问题。我有下表:
CREATE TABLE [dbo].[inputs](
[iid] [int] IDENTITY(1,1) NOT NULL,
[tag_id] [int] NULL,
[date_time] [datetime] NULL,
[input_raw] [float] NULL,
[input_calibrated] [float] NULL,
[input_type] [varchar](50) NULL,
[virtual_record] [varchar](50) NULL,
[status_change] [varchar](50) NULL,
[prev_stat_chg] [varchar](50) NULL,
[prev_status_change] [varchar](50) NULL,
[unix_timestamp] [float] NULL,
CONSTRAINT [PK_inputs] PRIMARY KEY CLUSTERED
(
[iid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]`
)我正在编写一个查询,以便以一种可以与我拥有的时间线图表一起使用的格式获取数据。需要数据按“"unix_timestamp”“分组,具有"n”个tag_id的"input_raw“。
例如:
SELECT TOP 20 inputs.unix_timestamp, inputs.input_raw, inputs.tag_id
FROM [200030].[dbo].inputs
WHERE inputs.tag_id = 92149 or inputs.tag_id = 92164
ORDER BY unix_timestamp DESC给出了结果:
unix_timestamp input_raw tag_id
1357788990 313 92149
1357788990 210 92164
1357788690 313 92149
1357788690 210 92164
1357788390 313 92149
1357788390 210 92164
1357788090 313 92149
1357788090 210 92164
1357787790 313 92149
1357787790 210 92164
1357787490 313 92149
1357787490 210 92164
1357787190 313 92149
1357787190 210 92164
1357786890 313 92149
1357786890 210 92164
1357786590 313 92149
1357786590 210 92164
1357786290 313 92149
1357786290 210 92164我需要一个像这样的结果:
unix_timestamp tag(92149) tag(92164)
1357788990 313 210
1357788690 313 210
|
|
Vetc...如果时间戳上的其他标签有任何其他数据,则还需要字符串"undefined“或”NULL“,如果一个标签中有任何丢失的数据。
有什么帮助吗?
发布于 2013-01-11 00:00:32
这是数据的轴心。您没有指定正在使用的RDBMS,但您可以在所有数据库中使用以下内容:
SELECT unix_timestamp,
max(case when inputs.tag_id = 92149 then input_raw else null end) tag_92149,
max(case when inputs.tag_id = 92164 then input_raw else null end) tag_92164
FROM [200030].[dbo].inputs
GROUP BY unix_timestamp请参阅SQL Fiddle with Demo
如果使用具有PIVOT函数(SQL Server/Oracle)的数据库,则可以使用:
select *
from
(
select unix_timestamp,
input_raw,
tag_id
from [200030].[dbo].inputs
) src
pivot
(
max(input_raw)
for tag_id in ([92149], [92164])
) piv请参阅SQL Fiddle with Demo
两者的结果都是:
| UNIX_TIMESTAMP | 92149 | 92164 |
----------------------------------
| 1357786290 | 313 | 210 |
| 1357786590 | 313 | 210 |
| 1357786890 | 313 | 210 |
| 1357787190 | 313 | 210 |
| 1357787490 | 313 | 210 |
| 1357787790 | 313 | 210 |
| 1357788090 | 313 | 210 |
| 1357788390 | 313 | 210 |
| 1357788690 | 313 | 210 |
| 1357788990 | 313 | 210 |发布于 2013-01-10 23:59:59
SELECT unix_timestamp,
MAX(CASE WHEN tag = 92149 THEN input_raw ELSE NULL END) [tag92149],
MAX(CASE WHEN tag = 92164 THEN input_raw ELSE NULL END) [tag92164]
FROM tableName
GROUP BY unix_timestamp或
SELECT unix_timestamp, [92149] As tag92149, [92164] as tag92164
FROM
(
SELECT unix_timestamp,
tag,
input_raw
FROM tableName
) a
PIVOT
(
MAX(input_raw)
for tag in ([92149], [92164])
) b发布于 2013-01-11 00:00:26
这是一个旋转查询。您可以使用以下命令在任何数据库中执行此操作:
select unix_timestamp,
max(case when tag = 92149 then input_raw end) as tag_92349,
max(case when tag = 92164 then input_raw end) as tag_92164
from (SELECT TOP 20 inputs.unix_timestamp, inputs.input_raw, inputs.tag_id
FROM [200030].[dbo].inputs
WHERE inputs.tag_id = 92149 or inputs.tag_id = 92164
) t
group by unix_timestamp
ORDER BY unix_timestamp DESChttps://stackoverflow.com/questions/14261932
复制相似问题