【问题标题】:Postgresql Group By并为不同的值创建列
【发布时间】:2022-01-19 15:03:26
【问题描述】:

我正在使用 Postgresql 并且有这个表:

device_id date variable_name pulses
1 2021-03-29 height 10
1 2021-03-29 speed 20
1 2021-03-30 height 30
1 2021-03-30 temperature 40
2 2021-03-29 height 50
2 2021-03-29 acceleration 60
2 2021-03-29 distance 70

并且想查询所以我按设备ID和日期分组,并按变量名创建列,所以预期的表是:

device_id date height speed temperature acceleration distance
1 2021-03-29 10 20 0 0 0
1 2021-03-30 30 0 40 0 0
2 2021-03-29 50 0 0 60 70

知道怎么做吗?

【问题讨论】:

  • 如果稍后添加颜色变量名会发生什么?忽略,还是自动在结果中添加颜色列?
  • 忽略,否则我将不得不手动将新的 variable_name 添加为另一列
  • 你可以使用case表达式来做条件聚合

标签: sql postgresql group-by


【解决方案1】:

除了crosstab,还有更直接的方式是通过case操作符

Select device_id, date, 
       Sum(Case When variable_name='height' Then pulses Else 0 End) As height,
       Sum(Case When variable_name='speed' Then pulses Else 0 End) As speed,
       Sum(Case When variable_name='temperature' Then pulses Else 0 End) As temperature,
       Sum(Case When variable_name='acceleration' Then pulses Else 0 End) As acceleration,
       Sum(Case When variable_name='distance' Then pulses Else 0 End) As distance
From Tbl
Group by device_id, date
Order by device_id, date

数据输出:

device_id| date                 | height | speed | temperature | acceleration | distance
_________|______________________|________|_______|_____________|______________|_________
        1| 2021-03-29 00:00:00  |      10|     20|            0|             0|        0
        1| 2021-03-30 00:00:00  |      30|      0|           40|             0|        0
        2| 2021-03-29 00:00:00  |      50|      0|            0|            60|       70

【讨论】:

  • 谢谢!我只是想知道你为什么使用 Sum?
  • @TOMAS RIQUELME GAJARDO 不客气。应该使用聚合,否则您将获得与不同变量名称一样多的 device_id 和日期值行。
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 2020-02-08
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
相关资源
最近更新 更多