Удаление дублирующихся строк в SQL - PullRequest
0 голосов
/ 01 июня 2018

У меня есть запрос, который возвращает список устройств, которые имеют несколько «перемещенных» дат.Я хочу только самую старую запись даты.Я использовал функцию MIN, чтобы дать мне самую старую дату, но я все еще получаю несколько записей (однако, я получаю меньше, чем раньше).Я пытался получить более точное JOIN, но больше не мог сузить поля.

Если вы посмотрите на скриншот, первые три строки имеют одинаковое "wonum", но три разных "Перемещенные даты. "Я думаю, что если я смогу каким-то образом взять самую старую «дату переезда» из этих трех и удалить другие строки, это даст мне результат, который я ищу.Тем не менее, я не достаточно опытен, чтобы сделать это (я работаю в SQL только несколько месяцев).Будет ли это работать, или есть лучший способ сузить мои результаты?Мне интересно, если мне нужно выполнить какой-то подзапрос, чтобы получить то, что мне нужно.

Я осмотрелся, но не могу найти ничего, что позволило бы мне удалить строку данных так, как яищуТакже я не могу найти причину, по которой моя функция MIN не обрабатывает данные больше, чем она есть.Ниже приведен код, который я сейчас использую.Спасибо за любую помощь, которая может быть оказана.

SELECT wo.wonum, wo.location, wo.statusdate, wo.status, l.subcontractor,
    wo.description, MIN(ast.datemoved) AS 'Moved Date'
FROM workorder wo
        JOIN locations l ON wo.location = l.location
        JOIN asset a ON wo.location = a.location 
          -- AND wo.assetnum = a.assetnum
        JOIN assettrans ast ON a.assetnum = ast.assetnum
          -- AND a.assetid = ast.assetid
WHERE wo.description LIKE '%deteriorating%'
        AND wo.status != 'close'
GROUP BY wo.wonum, wo.location, wo.statusdate, 
  wo.status, l.subcontractor, wo.description
ORDER BY wo.wonum;

Результат запроса DBV SQL

Обновление : Табличные данные

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Пожалуйста, проверьте перед использованием в производстве

- если у вас есть столбец идентификатора и вы оставили самую старую запись

удалить из T1 из MyTable T1, MyTable T2, где T1.dupField = T2.dupField(и добавьте больше фильтров, если применимо) и T1.uniqueField> T2.uniqueField

- если вы хотите удалить новые «перемещенные даты» и оставить самую старую

удалить из T1 изMyTable T1, MyTable T2, где T1.dupField = T2.dupField (и добавить дополнительные фильтры, если применимо) и T1.Moved Dates> T2.Moved Dates

0 голосов
/ 02 июня 2018

Вы должны выполнить группировку в операторе соединения внутри подзапроса (не проверялось, но вы поймете, что идея):

Заменить

JOIN assettrans ast ON a.assetnum = ast.assetnum

на

inner join
(
    select ast.assetnum,MIN(ast.datemoved) AS 'Moved Date' 
    from assettrans ast  
    group by ast.assetnum
) grouped
on a.assetnum = grouped.assetnum

Итак, полный запрос выглядит так:

SELECT wo.wonum, wo.location, wo.statusdate, wo.status, l.subcontractor,
    wo.description, grouped.MovedDate
FROM workorder wo
        JOIN locations l ON wo.location = l.location
        JOIN asset a ON wo.location = a.location 
        INNER JOIN
        (
           select ast.assetnum,MIN(ast.datemoved) AS MovedDate 
           from assettrans ast  
           group by ast.assetnum
        ) grouped
        on a.assetnum = grouped.assetnum
    WHERE wo.description LIKE '%deteriorating%'
            AND wo.status != 'close'
    ORDER BY wo.wonum;
...