sql - Rails Postgres 查询,仅选择出现在所有具有关联的搜索参数中的项目

标签 sql ruby-on-rails postgresql ruby-on-rails-5 rails-activerecord

我正在寻找基于一些用户选择参数的 Postgres 查询。

用户将选择一家商店以及开始和结束年份。提交后,我只想显示仅存在于所有选定年份的商品的平均价格。

例如,用户选择开始日期为 2014 年,结束日期为 2018 年。项目香蕉具有所有这些年的特征,但苹果仅具有 2014、2015 和 2017 年的特征。所以我的最终结果将只显示平均价格香蕉而不是苹果。

到目前为止,这是我开发的查询。我不确定如何最好地实现仅对所有搜索年份中出现的项目进行平均的部分。

@sale_averages = Sale.joins(:shops, :items).where('extract(year from season_year) < ? AND extract(year from season_year) > ? ', params[:start_year], params[:end_year])
.where('shops.name = ?', params[:select_shop])
.select('items.name, AVG(sale.price) as price').group('shop.name')

架构

create_table "items", force: :cascade do |t|
 t.string "name"
end

create_table "sales", force: :cascade do |t|
 t.integer "shop_id"
 t.integer "item_id"
 t.date "season_year"
 t.decimal "price"
end

create_table "shops", force: :cascade do |t|
 t.string "name"
end

最佳答案

您可以查看每年有哪些项目有记录。您可以通过检查每个项目的不同年份数是否等于年份总数(使用 COUNT DISTINCT )来做到这一点:

 number_years = params[:end_year].to_i - params[:start_year].to_i + 1
 @sale_averages = Sale.joins(:shops, :items)
                      .select('items.name, AVG(sale.price) as price')
                      .where("EXTRACT(year from season_year) BETWEEN #{params[:start_year]} AND #{params[:end_year]}")
                      .where('shops.name': params[:select_shop])
                      .group('items.name')
                      .having("(COUNT(DISTINCT(EXTRACT(year from season_year))) = #{number_years})")

我也用过BETWEEN而不是 <> . 我认为您想按商品名称而不是商店进行分组(因为它在您的原始查询中)。

关于sql - Rails Postgres 查询,仅选择出现在所有具有关联的搜索参数中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55083724/

相关文章:

ruby-on-rails - Backbone.js 服务器端验证和其他服务器端错误

ruby-on-rails - 今天和明天的日期类返回相同 - 奇怪而有趣的错误

java - 如何在 java 字符串查询中为 DB2 列创建别名?

mysql - SQL查询group by和where导致返回不正确的数据

ruby-on-rails - 混合单选按钮和 text_field

c# - 为什么我收到错误 : An operation is already in progress

sql - 奇怪的 postgres SELECT 排序问题

c# - EFCore 中的 Npgsql 无法翻译 DateTimeOffset.Date

sql - Postgres - 具有 WHERE AND 条件的单列上的多个条件?

python - 传递空列表时 SQL 查询 ( select ) 中的语法错误