【问题标题】:How to find the data corresponding to the last date for every category in rails如何在rails中查找每个类别的最后日期对应的数据
【发布时间】:2020-08-25 14:48:38
【问题描述】:

我目前正在尝试在 Rails 应用程序上列出不同的资产。我想访问每个资产的名称和最后一个值,所有这些都按市值排序。

这是我的数据库结构

`create_table "asset_values", force: :cascade do |t|
    t.integer "date"
    t.integer "asset_id"
    t.float "price"
    t.float "marketcap"
    t.float "volume"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "assets", force: :cascade do |t|
    t.string "name"
    t.string "symbol"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end`

日期是unix时间

这是我的资产对应的模型结构

    has_many :asset_value
    validates :name, :symbol, uniqueness: true
    validates :name, :symbol,  presence: true

这是我与asset_values对应的模型结构

     belongs_to :asset, foreign_key: "asset_id"

示例:

Assets:
    id: 1, name: Bitcoin, symbol: BTC
    id: 2, name: Ethereum, symbol: ETH

Asset_values:
    id:1, price: 12000, marketcap: 211 000 000 000, volume 100, asset_id: 1, date: 1 598 300 000
    id:2, price: 11000, marketcap: 210 000 000 000, volume 110, asset_id: 1, date: 1 598 200 000
    id:3, price: 400, marketcap: 42 000 000 000, volume 20, asset_id: 2, date: 1 598 300 000
    id:4, price: 420, marketcap: 43 000 000 000, volume 20, asset_id: 2, date: 1 598 200 000


The_table_i_want : 
    id: 1, name: Bitcoin, symbol: BTC, price: 12000, marketcap: 211 000 000 000, volume 100, date: 1 598 300 000
    id: 2, name: Ethereum, symbol: ETH, price: 400, marketcap: 42 000 000 000, volume 20, date: 1 598 300 000

我尝试了不同的调用来访问数据,但它们都不起作用... 这是我认为最好的

    sql = ("
      SELECT a.id, a.name, a.symbol, v.price, v.marketcap, v.volume, v.date
      FROM assets AS a
      INNER JOIN asset_values AS v ON a.id = v.asset_id
      INNER JOIN (
        SELECT MAX(date)
        FROM asset_values
        GROUP BY asset_id
        ) AS p 
      ON a.id = p.asset_id
      ORDER BY v.marketcap DESC
        ")
   @data = ActiveRecord::Base.connection.execute(sql)


我正在使用 postgresql 和 rails 6

【问题讨论】:

  • 我认为最好将最新的市值市值保存在资产表中,这样您就可以进行非常简单的查询。 Asset.order('marketcap desc')
  • 可以,但我更喜欢没有重复的干净数据库;-)

标签: sql ruby-on-rails ruby postgresql


【解决方案1】:

如果对您的查询进行的这些调整产生了您所期望的结果,请告诉我

  SELECT a.id
        ,a.name
        ,a.symbol
        ,v.price
        ,v.marketcap
        ,v.volume
        ,v.date
  FROM assets AS a
  INNER JOIN asset_values AS v 
        ON a.id = v.asset_id
  INNER JOIN (
        SELECT asset_id
              ,MAX(date) as max_date
        FROM asset_values
        GROUP BY asset_id
        ) AS p  
        ON v.asset_id = p.asset_id 
           AND v.date = p.max_date
  ORDER BY v.marketcap DESC

如果您使用的是 postgresql 9.3+,则可以使用横向连接

 SELECT a.id
        ,a.name
        ,a.symbol
        ,v.price
        ,v.marketcap
        ,v.volume
        ,v.date
  FROM assets AS a
  INNER JOIN LATERAL
  ( SELECT asset_id 
        ,price
        ,marketcap
        ,volume
        ,date
    FROM asset_values 
    WHERE asset_id=a.id
    ORDER BY created_at ASC LIMIT 1 ) v 
          ON v.asset_id=a.id
 ORDER BY v.marketcap DESC

【讨论】:

  • 非常感谢!但是,我对第二个有问题。 (错误:“ORDER”第 18 行或附近的语法错误:ORDER BY v.marketcap DESC ^)。我会用第一个
  • 就像任何加入一样,它需要一个 on 子句,我忘了写,我已经编辑了我的答案。
猜你喜欢
  • 2012-12-26
  • 2020-11-19
  • 2016-01-19
  • 1970-01-01
  • 2016-06-09
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多