Удалить дублирующиеся записи, сохраняя последний знак ActiveRecord - PullRequest
0 голосов
/ 25 января 2019

Я пытался удалить дублирующиеся записи (то же значение в столбце shopify_order_id), чтобы сохранить самую последнюю.

Я написал это в sql:

select orders.id from (
  select shopify_order_id, min(shopify_created_at) as min_created 
  from orders group by shopify_order_id having count(*) > 1 limit 5000
) as keep_orders 
join orders 
on 
  keep_orders.shopify_order_id = orders.shopify_order_id and 
  orders.shopify_created_at <> keep_orders.min_created

и сейчас я пытаюсь получить его в Active Record, но не могу соединить эти две части.

Первый вложенный выбор -

Order.select('shopify_order_id, MIN(shopify_created_at) as min_created').
        group(:shopify_order_id).
        having('count(*) > 1').
        limit(5000)

но тогда не работает следующее:

Order.select('orders.id').from(keep_orders, :keep_orders).
joins('orders ON keep_orders.shopify_order_id = orders.shopify_order_id').
where.not('orders.shopify_created_at = keep_orders.min_created')

строит запрос:

SELECT  orders.id FROM  (SELECT  shopify_order_id, MIN(shopify_created_at) as min_created FROM "orders" GROUP BY "orders"."shopify_order_id" HAVING (count(*) > 1) LIMIT $1) keep_orders  orders ON keep_orders.shopify_order_id = orders.shopify_order_id WHERE NOT (orders.shopify_created_at = keep_orders.min_created) ORDER BY "orders"."id" ASC LIMIT $2  [["LIMIT", 5000], ["LIMIT", 1]]

, в котором отсутствует ключевое слово join.

Любая помощь в том, как реорганизовать запрос / сделать его другим способом, будет более чем полезной.

1 Ответ

0 голосов
/ 25 января 2019

Если вы вызываете joins со строковым фрагментом SQL , вам нужно указать тип соединения, которое вы хотите:

Order.select('orders.id').from(keep_orders, :keep_orders)
  .joins('JOIN orders ON keep_orders.shopify_order_id = orders.shopify_order_id')
  .where.not('orders.shopify_created_at = keep_orders.min_created')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...