【问题标题】:Optimize query for multiple unions优化多个联合的查询
【发布时间】:2020-12-17 04:43:48
【问题描述】:

我们有一张这样的桌子

------------------------------------------
| user_id | timestamp | key      | value |
------------------------------------------
   99     | 1598603308 | Spo2 |      99
   99     | 1598603318 | Spo2 |      98
   99     | 1598603328 | Spo2 |      96
   99     | 1598603338 | Spo2 |      97
...
...
   99     | 1598603307 | Breath |      99
   99     | 1598603311 | Breath |      98
   99     | 1598603315 | Breath |      96
   99     | 1598603319 | Breath |      97

我们的想法是为 id 为 99 的用户获取最新的 Breath 和最新的 Spo2。

select user_id, timestamp, key, value from session_records
where
user_id = 99 and key = 'Spo2' and value > 0 order by timestamp desc limit 1
**UNION**
select user_id, timestamp, key, value from session_records
where
user_id = 99 and key = 'Breath' and value >= 0 order by timestamp desc limit 1

现在key 可以变化。它可以是HeartRateSdnn 或动态传入的东西。

有没有其他方法可以在没有联合的情况下编写此查询?

【问题讨论】:

  • UNION ALL 至少会让它更快一点,但无论如何 GMB 的建议更好
  • 查看我对your other question 的回复。该功能也应该适用于此。

标签: sql postgresql query-optimization greatest-n-per-group


【解决方案1】:

只需使用distinct on:

select distinct on (user_id, key) s.*
from session_record s
where user_id = 99 and key in ('Breath', 'Spo2')
order by user_id, key, timestamp desc

您可以根据需要调整 where 子句谓词 - 查询的其余部分保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2014-06-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多