SQL 使每 n 行成为一个单独的列

SQL Make every n row to a seperate column

我有一个小问题。我的问题是我有一个 table,只有一列带有传感器数据。每三行代表一个新样本。我现在的目标是将每三行转换为一个单独的列,如 3 x N 矩阵。我不知道我的 N 有多大。 SQL 可以做到这一点吗?

--值--
sensor_sampleA1
sensor_sampleA2
sensor_sampleA3
sensor_sampleB1
sensor_sampleB2
sensor_sampleB3
...
...
...
sensor_sampleN1
sensor_sampleN2
sensor_sampleN3

我想要这个。

--TARGET_TABLE--
样本A1 样本B1 样本C1 ... ... 样本N1
样本A2 样本B2 样本C2 ... ... 样本N2
样本 A3 样本 B3 样本 C3 ... ... 样本 N3

更新:我以上面的数字 3 为例。我有 11 个传感器,每秒可提供 11 个值。我的专栏是:sensor_data_id、axis、source、type、value 和 sample_id.

picture of the database

这是一个想法 - 首先使用行号对数据进行分组,然后您可以 select 将结果放入临时 table 或用作子查询:

SELECT sensor_sample, ((ROW_NUMBER() OVER (ORDER BY sensor_sample) -1) / 3) AS sensor_group_id
FROM sensor_table

这是可能的解决方案之一。我使用了前 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

如果您使用的是 SQL 服务器,我建议您使用 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