SQL将每n行设为一个单独的列

时间:2018-01-08 19:22:58

标签: sql postgresql matrix dbeaver

我有一个小问题。我的问题是我有一个带有传感器数据的单列表。每隔三行代表一个新样本。我的目标是立即将每三行转换为一个单独的列,如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。

picture of the database

3 个答案:

答案 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