【问题标题】:How to delete data from DB with the same dates except the biggest date. Rails 3如何从数据库中删除除最大日期外具有相同日期的数据。导轨 3
【发布时间】:2014-05-01 10:04:17
【问题描述】:

我有这样的日期:

=> #<Item id: 8749, asin: "B000V2ACH8", created_at: "2014-03-24 00:15:24">
=> #<Item id: 8750, asin: "B000V2ACH8", created_at: "2014-03-24 14:35:24">
=> #<Item id: 8751, asin: "B000V2ACH8", created_at: "2014-03-24 19:35:24">
=> #<Item id: 8752, asin: "B000V2ACH8", created_at: "2014-03-24 17:35:24">
...
=> #<Item id: 8753, asin: "7770V2A888", created_at: "2014-03-24 21:58:24">
=> #<Item id: 8754, asin: "7770V2A888", created_at: "2014-03-24 05:24:24">
...
=> #<Item id: 8755, asin: "7770V2A888", created_at: "2014-03-23 23:58:24">
=> #<Item id: 8756, asin: "7770V2A888", created_at: "2014-03-23 22:58:24">
...
=> #<Item id: 8757, asin: "7770V2A888", created_at: "2014-03-22 19:58:24">
=> #<Item id: 8759, asin: "7770V2A888", created_at: "2014-03-22 10:58:24">
=> #<Item id: 8760, asin: "7770V2A888", created_at: "2014-03-22 23:33:33">

如何获取相同年月日的最大值(create_at)并删除具有相同 asin 和相同年月日(低于该日期的最大值)的其余部分? 想要获得像 ⬇

这样的值
=> #<Item id: 8751, asin: "B000V2ACH8", created_at: "2014-03-24 19:35:24">
=> #<Item id: 8753, asin: "7770V2A888", created_at: "2014-03-24 21:58:24">
=> #<Item id: 8755, asin: "7770V2A888", created_at: "2014-03-23 23:58:24">
=> #<Item id: 8760, asin: "7770V2A888", created_at: "2014-03-22 23:33:33">

【问题讨论】:

  • 您要删除 asin = 'B000V2ACH8' 的记录吗?
  • 我有大量数据。除了这个 asin 的最大日期之外,我想用相同的 asin 和 year-month-date 删除。对不起,我的英语。
  • 再次抱歉。我更新了问题。
  • @emaillenin 我更新了问题。可能,我也需要按年月日或类似的东西对其进行分组:)
  • 我已经相应地更新了答案

标签: sql ruby-on-rails ruby-on-rails-3 postgresql activerecord


【解决方案1】:

group_records = Item.where('id&gt;0') # you can put any conditions inwhere` 子句

max_date = group_records.select('max(created_at) as m').first.m
group_records.where('created_at < ?', max_date).delete_all

【讨论】:

  • 这将删除所有早于最大日期的记录。 OP 要求删除每个 asin 组。
  • @whitesiroi 这对你有用吗?我的意思是它是否根据 asin 组删除>
  • @emaillenin 是的,我添加了 WHERE,所以它基于 asin 组。但我还没有弄清楚一件事。我更新了我的问题。谢谢你们的帮助。
  • @emaillenin,你是对的。我已经改变了答案。
【解决方案2】:

使用 SQL:

DELETE items
FROM items
INNER JOIN (select asin,cast(created_at) created_date, max(created_at) as m
from items group by asin) max_items ON max_items.asin = asin.asin
AND max_items.created_date = cast(items.created_at as DATE)
WHERE items.created_at < max_items.created_at

【讨论】:

  • 感谢您的更新。 PG::SyntaxError: ERROR: syntax error at or near ")" (ActiveRecord::StatementInvalid) LINE 1: ...from Items INNER JOIN (select asin,cast(created_at) created_...
【解决方案3】:

绝对不是最好的答案,但它对我有用:) 例子:)

  @item.try(:each) do |i|
    for j in 0..10
      group_records = Item.where(:asin => i.asin, :domain => i.domain, :user_id => i.user_id).where(:created_at => Date.today.beginning_of_day - j.day..Date.today.end_of_day - j.day)
      max_date = group_records.select('max(created_at) as m').first.m
      group_records.where('created_at != ?', max_date).delete_all
    end
  end

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 2018-11-15
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多