Удаление дубликатов из одного поля, где остальная часть строки не дублируется - PullRequest
3 голосов
/ 09 мая 2019

У меня проблема, когда набор данных иногда возвращает 2 строки для серийного номера. Это происходит, когда серийный номер был удален и имеет одну строку, в которой дата удаления равна NULL, и одну строку, в которой его заполнено

Мне удалось получить запрос, в котором значения NULLS удалены, с помощью предложения min () и group by, но это также удаляет значения NULL, в которых счетчик не был удален.

SELECT  [MeterSerialNumber]
      ,[EquipmentType]
      ,[InstallDate]
      ,min ([Removaldate] ) as REM_DATE
      ,round (DATEDIFF(DAY,InstallDate,case when Removaldate IS null then convert (date,GETDATE()) else Removaldate end)/30.42,0) as Age_M


  FROM [DOCDPT].[main].[Tbl_Device_ISU]

  where EquipmentType in ('S1','NS','NSS') or EquipmentType like ('%S2%')


  Group by MeterSerialNumber,EquipmentType,InstallDate,Removaldate having COUNT(distinct removaldate) =1

order by MeterSerialNumber
  ,Removaldate desc

Это результаты до добавления в min () и group by. Я хотел бы удалить ряд 2, так как счетчик был удален, но оставил 2 нижних ряда. Код выше, кажется, просто удаляет все NULL. Я хочу удалить значения NULL только в том случае, если счетчик чисел появляется более одного раза.

MeterSerialNumber I EquipmentType I InstallDate I  Removaldate  I Age_M
000009501794462   I S1            I 2017-06-18  I  2018-01-22   I  7.000000
000009501794462   I S1            I 2017-06-18  I  NULL         I 23.000000
000009999203079   I S1            I 2017-06-18  I  NULL         I 23.000000
000009995553079   I S1            I 2017-06-18  I  NULL         I 23.000000

Полагаю, проблема в том, что счетчик не считается NULL

1 Ответ

1 голос
/ 09 мая 2019

Если я правильно понимаю, я думаю, вам просто нужно удалить [Removaldate] из GROUP BY, избавиться от HAVING и использовать MIN ([Removaldate]) в расчете Age_M и ORDER BY следующим образом:

SELECT  
    [MeterSerialNumber]
    ,[EquipmentType]
    ,[InstallDate]
    ,MIN([Removaldate]) as REM_DATE
    ,ROUND(DATEDIFF(DAY, InstallDate, case when MIN(Removaldate) IS null then CONVERT (date,GETDATE()) else MIN(Removaldate) end)/30.42,0) as Age_M
FROM 
    Tbl_Device_ISU
WHERE 
    EquipmentType in ('S1','NS','NSS') or EquipmentType like ('%S2%')
GROUP BY 
    MeterSerialNumber,
    EquipmentType,
    InstallDate
ORDER BY 
    MeterSerialNumber,
    REM_DATE desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...