Удаление повторяющихся значений из столбца в SQL - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть две таблицы A (group_id, id, subject) и B (id, date).Ниже приведена сводная таблица таблиц A и B по id.Я попытался использовать разные и раздел, чтобы удалить дубликаты только в group_id (поле), но не повезло:

enter image description here

Мой код:

select 
    a.group_id, a.id, a.subject, b.date 
from
    A a 
inner join
    (select 
         b.*, 
         row_number() over (partition by group_id order by date asc) as seqnum
     from 
         B b) b on a.id = b.id and seqnum = 1
order by
    date desc; 

Я получил эту ошибку, когда запустил код:

Секционирование не может использоваться автономно в запросе рядом с 'разделение по порядку группы_ид по дате asc) как последовательность из B' встрока 1

Это мой ожидаемый результат:

my expected result:

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

Вы почти у цели.Но столбец, который вы пытаетесь использовать для разбиения (т. Е. group_id), взят из таблицы a, которая недоступна в подзапросе.

Вам потребуется JOIN и присвоить номер строки вподзапрос и затем фильтр во внешнем запросе.

select * 
from (
    select 
        a.group_id, 
        a.id, 
        a.subject, 
        b.date,
        row_number() over (partition by a.group_id order by b.date asc) as seqnum
    from a
    inner join b on ON a.id = b.id 
)
where seqnum = 1
ORDER BY date desc; 
1 голос
/ 23 сентября 2019

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

Я рекомендую коррелированный подзапрос в большинстве баз данных:

select b.*
from b
where b.date = (select min(b2.date)
                from b b2
                where b2.group_id = b.group_id
               );

Понятно.Вам нужно сначала join, а затем использовать row_number():

select ab.*
from (select a.group_id, a.id, a.subject, b.date,
             row_number() over (partition by a.group_id order by b.date) as seqnum
      from A a join
           B b
           on a.id = b.id
     ) ab
where seqnum = 1
order by date desc; 
0 голосов
/ 23 сентября 2019

Еще один способ достичь своей цели, хотя он может и не быть эффективным

SELECT
  A.group_id, A.id, B.Date, A.subject
FROM A
INNER JOIN B
ON A.Id = B.Id
INNER JOIN
(
  SELECT
    A.Group_id, MIN(B.Date) AS Date
  FROM A
  INNER JOIN B
  ON A.Id = B.Id
  GROUP BY A.group_id
) AS supportTable
ON A.group_id = supportTable.group_id
AND B.Date = supportTable.Date
...