【问题标题】:Group By Dynamic Ranges in SQL (cockroachdb/postgres)在 SQL 中按动态范围分组 (cockroachdb/postgres)
【发布时间】:2020-09-08 11:34:14
【问题描述】:

我的查询看起来像

select s.session_id, array_agg(sp.value::int8 order by sp.value::int8) as timestamps
from sessions s join session_properties sp on sp.session_id = s.session_id
where s.user_id = '6f129b1c-43a6-4871-86f6-1749bfe1a5af' and sp.key in ('SleepTime', 'WakeupTime') and value != 'None' and value::int8 > 0 
group by s.session_id 

结果会是这样的

f321c813-7927-47aa-88c3-b3250af34afa    | {1588499070,1588504354}
f38a8841-c402-433d-939d-194eca993bb6    | {1588187599,1588212803}
2befefaf-3b31-46c9-8416-263fa7b9309d    | {1589912247,1589935771}
3da64787-65cd-4305-b1ac-1393e2fb11a9    | {1589741569,1589768453}
537e69aa-c39d-484d-9108-2f2cd956d4ee    | {1588100398,1588129026}
5a9470ff-f930-491f-a57d-8c089e535d53    | {1589140368,1589165092}

第一列是唯一的 id,第二列是 fromto 时间戳。

现在我有第三个表,其中包含一些时间序列数据

records
------------------------
timestamp | name | value

是否可以从 fromto 时间戳上的 session_ids 组中的记录中找到 avg(value)

我可以在应用程序中运行一个 for 循环并进行联合以获得所需的结果。但我想知道postgrescockroachdb 是否有可能

【问题讨论】:

标签: sql database postgresql group-by cockroachdb


【解决方案1】:

我不会聚合这两个值,而是使用两个连接来查找它们。这样您就可以确定哪个值属于哪个属性。

一旦你有了它,你就可以将该结果加入到你的记录表中​​。

with ranges as (
  select s.session_id, st.value as from_value, wt.value as to_value
  from sessions s 
    join session_properties st on sp.session_id = s.session_id and st.key = 'SleepTime'
    join session_properties wt on wt.session_id = s.session_id and wt.key = 'WakeupTime'
  where s.user_id = '6f129b1c-43a6-4871-86f6-1749bfe1a5af' 
    and st.value != 'None' and wt.value::int8 > 0 
    and wt.value != 'None' and wt.value::int8 > 0 
)
select ra.session_id, avg(rc.value)
from records rc
  join ranges ra 
    on ra.from_value >= rc.timewstamp
   and rc.timestamp < ra.to_value
group by ra.session_id;

【讨论】:

  • 非常感谢@a_horse_with_no_name 它就像往常一样工作:) 我仍然会继续检查在for循环中为时间戳列表构建查询和执行联合所花费的时间。我可能有后续问题。
  • @Mayank:顺便说一句:你那里的数据模型太糟糕了
  • 让我试着证明一下。存在的重要数据在记录表中。记录表可以从任何地方输入,例如会话或非会话,可能只是时间值序列。非会话数据需要根据时间戳的范围属于一个会话,但数据属于一个用户。记录表中有更多列,其中之一是 user_id。这将修改像 join ranges ra on rc.user_id = ra.user_id and ra.from_... ra.to_value 这样的查询,因为会话也有 user_id。你现在是否也觉得它同样可怕?如果是,我需要帮助:)
猜你喜欢
  • 2020-04-29
  • 2021-05-06
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多