【问题标题】:SQL Make every n row to a seperate columnSQL使每n行成为一个单独的列
【发布时间】:2018-01-08 19:22:57
【问题描述】:

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

--价值观--
传感器样品A1
传感器样品A2
传感器样品A3
传感器样品B1
传感器样本B2
传感器样本B3
...
...
...
sensor_sampleN1
sensor_sampleN2
sensor_sampleN3

我想要这个。

--TARGET_TABLE--
样品A1 样品B1 样品C1 ... ... 样品N1
样品A2 样品B2 样品C2 ... ... 样品N2
sampleA3 sampleB3 sampleC3 ... ... sampleN3

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

picture of the database

【问题讨论】:

  • 只是为了解决这个问题:每个样本是否总是 3 个值? 3 列 N 行不是更有意义吗?
  • 是的,每个样本总是 3 个值。在我的上下文中,我的神经网络需要这种表示来填充数据......
  • 我不知道 ANSI SQL 能够进行这种转换。如果您有一个 ID 列(行号),那将很容易。但是依赖于您的数据库存储数据并在执行查询时读取数据的顺序?那是特定于数据库的。你有什么可用的工具?数据是以什么格式存储的?
  • 我的表名为 sensor_data 并且有一个可用于访问行号的主键。数据的顺序很重要,不允许改变。我将 PostgresSQL 与 DBeaver 一起使用。
  • 数据的命名方式是否可以按逻辑排序?示例:数据是否总是被命名为“sensor_sampleA1, `sensor_sampleA2', etc”?您能否提供一个数据示例或您用于提取和排序该数据的查询?

标签: sql postgresql matrix dbeaver


【解决方案1】:

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

    这里有一个想法 - 首先使用行号对数据进行分组,然后您可以将结果选择到临时表中或用作子查询:

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

    【讨论】:

      【解决方案3】:

      如果您使用的是 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-26
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-21
        • 2019-06-23
        • 1970-01-01
        相关资源
        最近更新 更多