为了提高性能,我需要一个sql来实现以下要求。
如果有表并且有以下列:
factory :company do
title Faker::Company.name
image Faker::Avatar.image("my-own-slug", "200x200")
end
当结果计数>时,如何获得最小时间戳(例如:t1)? 100000?
然后是以下sql结果 - count(*)将> 100000
id timestamp value
答案 0 :(得分:1)
我对您的问题的理解是:找到表中最早有至少100,000行的最早时间戳。
可能有很多方法可以做到;主要的困难是试图提出一个有效的方法。
我认为分析函数方法最有可能运作良好。最明显的选择是使用COUNT:
select min(timestamp) from (
select timestamp, count(*) over (order by timestamp rows between unbounded preceding and 1 preceding) earlier_rows
from table
)
where earlier_rows >= 100000
但我怀疑使用RANK或类似的东西会更快:
select min(timestamp) from (
select timestamp, rank() over (order by timestamp) time_rank
from table
)
where time_rank > 100000
我不确定是不是最重要的,但如果有重复的时间戳,这些结果可能略有不同。
答案 1 :(得分:0)
这将为您提供最小值和最大值以及计数
select
count(t.*),
min(t.timestamp),
max(t.timestamp)
from table t
where ( select count(*) from table t where t.timestamp < :t1 ) > 10000