Rails 5 выбрать дубликат по двум столбцам или атрибутам? - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть модель Пользователь, и моя база данных (postgres) была перенесена с повторяющимися значениями. Я хочу выбрать дубликаты строк по двум столбцам: код_группы и дата рождения: например,

id | group_code | birthdate
2  | 345        |  1980-05-05
3  | 261        |  1994-03-06
4  | 876        |  1997-09-16
5  | 345        |  1980-05-05

ожидаемый результат (с использованием активной записи): пользователь с идентификаторами 2 и 5

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

Вы также можете использовать count. Вот Демо

select
  id,
  group_code,
  birthdate
from
(
  select
    *,
    count(*) over (partition by group_code, birthdate) as cnt
  from myTable
) val
where cnt > 1 

Выход:

id  group_code  birthdate
--------------------------
2     345       1980-05-05
5     345       1980-05-05
1 голос
/ 18 апреля 2020

Вы можете использовать exists:

select t.*
from table t
where exists (select 1 
              from table t1 
              where t1.group_code = t.group_code and 
                    t1.birthdate = t.birthdate and 
                    t1.id <> t.id
             );
0 голосов
/ 18 апреля 2020

Судя по всему, вам нужен только один столбец. Похоже, кто-то мог создать две одинаковые записи. Вы можете решить эту проблему с помощью приведенного ниже кода, но также проверьте это здесь , чтобы избежать возможных дубликатов в базе данных в будущем при создании записи с рельсами

group = Model.where(group_code: 345).first
parameters = group.attributes

Model.where(group_code: 345).destroy_all

new_group = Model.find_or_create_by(group_code: 345)
new_group.update_attributes(parameters)
new_group.save

Отказ от ответственности: я сам новичок в рельсы, и, вероятно, есть гораздо лучший способ сделать это, но он делает следующее: находит все объекты, соответствующие критерию, затем сохраняет эти атрибуты ... затем удаляет все объекты в отношении where и воссоздает их. Вы даже можете добавить в .where со своей датой, если хотите. Model это название вашей модели. Также я работал с Rails 3 и 6. Я знаю, что это update_attributes для Rails 3, но более новая версия может устареть ... попробуйте обновить для других версий.

...