【问题标题】:Optimize SQL for two different category - Postgres为两个不同的类别优化 SQL - Postgres
【发布时间】:2021-09-04 13:45:56
【问题描述】:

我有一张看起来像的桌子

UserId Source HeartRate BreathRate
uuid 100 67 20
uuid 200 67 24
uuid 100 67 21
uuid 200 67 19
uuid 100 69 25
uuid 200 69 22
uuid 200 69 23
(select
    "UserId",
    "Source",
    avg(case when "HeartRate" > 0 then "HeartRate" end)::int as "HeartRate",
    avg(case when "BreathRate" > 0 then "BreathRate" end)::int as "BreathRate"
    from vitals
    where "UserId"='66fd490f-4d93-47d1-bc65-085f676bdaf2' and "Source"=200
    group by "UserId", "Source" order by "UserId")
    union
(select
    "UserId",
    "Source",
    avg(case when "HeartRate" > 0 then "HeartRate" end)::int as "HeartRate",
    avg(case when "BreathRate" > 0 then "BreathRate" end)::int as "BreathRate"
    from vitals
    where "UserId"='66fd490f-4d93-47d1-bc65-085f676bdaf2' and "Source"=100
    group by "UserId", "Source" order by "UserId")

如果有 2 个不同的来源,上述查询会产生 2 个结果。一个用于Source=100,另一个用于Source=200。结果中的行数应该(如果有足够的数据可用)等于不同 Source 值的数量。

如何更改上述查询,使其不依赖于多个选择的联合和Source 的静态值

【问题讨论】:

    标签: sql postgresql query-optimization union


    【解决方案1】:

    去掉过滤条件即可:

    select "UserId", "Source",
           avg(case when "HeartRate" > 0 then "HeartRate" end)::int as "HeartRate",
           avg(case when "BreathRate" > 0 then "BreathRate" end)::int as "BreathRate"
    from vitals
    where "UserId" = '66fd490f-4d93-47d1-bc65-085f676bdaf2' 
    group by "UserId", "Source"
    order by "UserId", "Source";
    

    如果你想要特定的来源,你可以在 (100, 200, ...)` 中使用and Source"。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      select
          "UserId",
          "Source",
          avg(case when "HeartRate" > 0 then "HeartRate" end) :: int as "HeartRate",
          avg(case when "BreathRate" > 0 then "BreathRate" end) :: int as "BreathRate"
      from vitals
      where
          "UserId" = '66fd490f-4d93-47d1-bc65-085f676bdaf2'
          and "Source" IN(100, 200)
      group by "UserId","Source"
      order by "UserId"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 2021-12-08
        • 2016-02-28
        • 1970-01-01
        • 2021-09-19
        • 2014-12-13
        • 1970-01-01
        相关资源
        最近更新 更多