我正在尝试寻找在Rails应用程序中使用公共表达式进行Postgres查询的最佳方法,知道ActiveRecord显然不支持公共表达式。
我有一个名为“user_activity_transitions”的表,其中包含一系列记录,这些记录表示用户活动的开始和停止(每行都表示状态的更改:例如开始或停止)。
一个“user_activity_id”可能有很多对被分开记录的开始和停止动作,它们在2个不同的行中。
如果活动当前正在进行且未停止,则也可能只存在"started"。 "sort_key"从第一个状态开始以0开始,并每次状态更改增加10。
我想要的是以下输出,将开始-停止的夫妻组合在一起,以便能够计算持续时间等。
它的作用是通过对排序键进行模运算,"欺骗" SQL 连接 2 个连续行。查询正常工作。但使用这个原始 AR 调用让我感到烦恼,特别是因为 connection.execute 返回的结果非常凌乱。基本上,我需要循环遍历结果并将其放入正确的哈希表中。有两个问题: 1.是否有一种方法可以摆脱 CTE 并使用 Rails 魔法运行相同的查询?2.如果没有,是否有更好的方法以漂亮的哈希方式获取所需的结果?请记住,我对 Rails 不是很了解,也不是查询专家,因此可能存在明显的改进...非常感谢!
我有一个名为“user_activity_transitions”的表,其中包含一系列记录,这些记录表示用户活动的开始和停止(每行都表示状态的更改:例如开始或停止)。
一个“user_activity_id”可能有很多对被分开记录的开始和停止动作,它们在2个不同的行中。
如果活动当前正在进行且未停止,则也可能只存在"started"。 "sort_key"从第一个状态开始以0开始,并每次状态更改增加10。
id to_state sort_key user_activity_id created_at
1 started 0 18 2014-11-15 16:56:00
2 stopped 10 18 2014-11-15 16:57:00
3 started 20 18 2014-11-15 16:58:00
4 stopped 30 18 2014-11-15 16:59:00
5 started 40 18 2014-11-15 17:00:00
我想要的是以下输出,将开始-停止的夫妻组合在一起,以便能够计算持续时间等。
user_activity_id started_created_at stopped_created_at
18 2014-11-15 16:56:00 2014-11-15 16:57:00
18 2014-11-15 16:58:00 2014-11-15 16:59:00
18 2014-11-15 17:00:00 null
这个表的实现方式使得查询变得更加困难,但为未来的改动(例如新的中间状态)提供了更多的灵活性,因此不会被修改。
我的Postgres查询(以及Rails中的相关代码):
query = <<-SQL
with started as (
select
id,
sort_key,
user_activity_id,
created_at as started_created_at
from
user_activity_transitions
where
sort_key % 4 = 0
), stopped as (
select
id,
sort_key-10 as sort_key2,
user_activity_id,
created_at as stopped_created_at
from
user_activity_transitions
where
sort_key % 4 = 2
)
select
started.user_activity_id AS user_activity_id,
started.started_created_at AS started_created_at,
stopped.stopped_created_at AS stopped_created_at
FROM
started
left join stopped on stopped.sort_key2 = started.sort_key
and stopped.user_activity_id = started.user_activity_id
SQL
results = ActiveRecord::Base.connection.execute(query)
它的作用是通过对排序键进行模运算,"欺骗" SQL 连接 2 个连续行。查询正常工作。但使用这个原始 AR 调用让我感到烦恼,特别是因为 connection.execute 返回的结果非常凌乱。基本上,我需要循环遍历结果并将其放入正确的哈希表中。有两个问题: 1.是否有一种方法可以摆脱 CTE 并使用 Rails 魔法运行相同的查询?2.如果没有,是否有更好的方法以漂亮的哈希方式获取所需的结果?请记住,我对 Rails 不是很了解,也不是查询专家,因此可能存在明显的改进...非常感谢!
arel
重写SQL。 - Малъ Скрылевъ