我有一个小问题。我的问题是我有一个带有传感器数据的单列表。每隔三行代表一个新样本。我的目标是立即将每三行转换为一个单独的列,如3 x N矩阵。我不知道我的N有多大。是否可以使用SQL执行此操作?
- VALUES--
sensor_sampleA1
sensor_sampleA2
sensor_sampleA3
sensor_sampleB1
sensor_sampleB2
sensor_sampleB3
...
...
...
sensor_sampleN1
sensor_sampleN2
sensor_sampleN3
我想要这个。
- TARGET_TABLE--
sampleA1 sampleB1 sampleC1 ...... sampleN1
sampleA2 sampleB2 sampleC2 ...... sampleN2
sampleA3 sampleB3 sampleC3 ...... sampleN3
更新:我使用上面的数字3作为例子。我有11个传感器,每秒给我11个值。我的列是:sensor_data_id,axis,source,type,value和sample_id。
答案 0 :(得分:0)
这是一个想法 - 首先使用行号对数据进行分组,然后您可以将结果选择到临时表中或用作子查询:
SELECT sensor_sample, ((ROW_NUMBER() OVER (ORDER BY sensor_sample) -1) / 3) AS sensor_group_id
FROM sensor_table
答案 1 :(得分:0)
这是可能的解决方案之一。我使用了前4种测量类型 - 应该说明它。
select
sample_id
,max(case when axis = 'X' and type = 'linear acceleration' then value else null end) as sensor1
,max(case when axis = 'Y' and type = 'linear acceleration' then value else null end) as sensor2
,max(case when axis = 'Z' and type = 'linear acceleration' then value else null end) as sensor3
,max(case when axis = 'X' and type = 'gyroscope ' then value else null end) as sensor4
from have
group by sample_id
答案 2 :(得分:0)
如果您使用的是SQL Server,我建议您使用PIVOT。我认为有一种方法可以使用CROSSTAB在PostgreSql中复制PIVOT,但是我不太熟悉它来尝试编写它。
以下是MSSQL版本,以防您想尝试转换它:
SELECT
sample_id,
source,
[la_x],[la_y],[la_z],
[gy_x],[gy_y],[gy_z],
[st_a],[rv_r],[rv_p],
[rv_y],[rv_m]
FROM
(
SELECT
CONCAT(
CASE type
WHEN 'linear acceleration' THEN 'la'
WHEN 'gyroscope' THEN 'gy'
WHEN 'stepcounter' THEN 'st'
ELSE 'rv'
END, '_',
ISNULL(LEFT(axis,1),'a')) 'dtype',
value 'value',
sample_id 'sample_id',
source 'source'
FROM
sensortable
) sq
PIVOT
(
SUM(value) FOR
dtype IN
([la_x],[la_y],[la_z],
[gy_x],[gy_y],[gy_z],
[st_a],[rv_r],[rv_p],
[rv_y],[rv_m])
) pv