none
Deletar Registros Duplicados por Group By RRS feed

  • Pergunta

  • Bom dia,

    Alguém sabe se existe a possibilidade de deletar registros duplicados da seguinte forma:

    Tenho uma query que traz o resultado

    Todos os campos se repetem menos o campo NDO, e NDOGroup, são estes campos que estão duplicando os registros. 

    Sou obrigada a colocar estes dois campos no meu group by quando dou o select.

    Exemplo:

     SELECT

       AD.[vch_od],
       MK.NDMarket,  
       MK.TypeMercado,
       MK.NDOrigin as Praça,
       TR.Analyst,
      -- DTB.Season,
     --  DTB.EvDef,
       AD.[dtt_data_captura],
       AD.semana,
       AD.DataMes,
       AD.NDO,
       AD.NDOGroup,
    --   PR.valorpremium,  
       AD.[Flt Type],
       IND.[Flt Type],
       AD.[Flt_base] as AD,
       G3.[flt_base] as G3,
       JJ.[flt_base] as JJ,
       OC.[flt_base] as OC,
       P3.[flt_base] as P3
      -- IND.[flt_base] as IND

    from #TARIFASAD AD

    GROUP BY    
    AD.[vch_od],
       MK.NDMarket,  
       MK.TypeMercado,
       MK.NDOrigin,
       TR.Analyst,
     --  DTB.Season,
     --  DTB.EvDef,
      -- AD.NDOGroup,
       AD.[dtt_data_captura],
       AD.semana,
       AD.DataMes,
       AD.NDO,
       AD.NDOGroup,
       --   PR.valorpremium,  
       AD.[Flt Type],
       IND.[Flt Type],
       AD.[Flt_base],
       G3.[flt_base],
       JJ.[flt_base],
       OC.[flt_base],
       P3.[flt_base] 
      -- IND.[flt_base] as IND


    Hoje meu resultado é este:

    Não tem registro duplicado. Me traz a média tarifada por data de captura (agrupados)

    Preciso inserir as duas colunas NDO, e NDOGroup 

    que são: 

         

    datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data]) AS NDO, 

      case
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '1' then 'NDO 00'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '5' then'(1-4)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '8' then '(5-7)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'15' then '(8-14)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'22' then '(15-21)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'30' then '(22-29)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'50' then '(30-49)'
      else '50+'
      END AS NDOGroup

    Eu entendo que o campo dtt_data, mostrado exemplo abaixo, irá diferenciar. Por mais que dtt_captura seja dia 12/01/2016, em várias linhas o campo dtt_data irá ser diferente. Assim no datadiff acima as vezes vai me dar a diferença de 1 dia, as vezes 3 e assim por diante. 

    Mas gostaria de encontrar uma forma de trazer o NDOGroup de um grupo só sem repetir:

    case
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '1' then 'NDO 00'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '5' then'(1-4)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '8' then '(5-7)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'15' then '(8-14)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'22' then '(15-21)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'30' then '(22-29)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'50' then '(30-49)'
      else '50+'

    E com um unico campo de NDOGroup trazer o NDO correspondente:

    datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data]) 

    Eu pensei em algo mais ou menos, deletar registros do campo NDOGroup e NDO me trazendo a menor ou maior

     DELETE a FROM #TARIFASAD AS a, nomes AS b WHERE a.vch_od=b.vch_od AND a.NDOGroup < b.NDOGroup

    Obrigada


    sexta-feira, 31 de março de 2017 11:23

Respostas

  • Thaís, além de diferenças nas colunas NDO e NDOGroup, o mesmo se observa nas colunas dtt_data_captura, semana, AD e provavelmente em outras que não aparecem no recorte.

    A cláusula GROUP BY geralmente é utilizada para sumarização; entretanto, não há nenhuma função de agregação na lista_de_colunas da cláusula SELECT.

    Poderia postar exemplo de qual é o resultado desejado?


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    Ola

    Hoje meu resultado é este:

    Não tem registro duplicado. Me traz a média tarifada por data de captura (agrupados)

    Preciso inserir as duas colunas NDO, e NDOGroup 

    que são: 

         

    datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data]) AS NDO, 

      case
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '1' then 'NDO 00'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '5' then'(1-4)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '8' then '(5-7)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'15' then '(8-14)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'22' then '(15-21)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'30' then '(22-29)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'50' then '(30-49)'
      else '50+'
      END AS NDOGroup

    Eu entendo que o campo dtt_data, mostrado exemplo abaixo, irá diferenciar. Por mais que dtt_captura seja dia 12/01/2016, em várias linhas o campo dtt_data irá ser diferente. Assim no datadiff acima as vezes vai me dar a diferença de 1 dia, as vezes 3 e assim por diante. 

    Mas gostaria de encontrar uma forma de trazer o NDOGroup de um grupo só sem repetir:

    case
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '1' then 'NDO 00'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '5' then'(1-4)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '8' then '(5-7)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'15' then '(8-14)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'22' then '(15-21)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'30' then '(22-29)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'50' then '(30-49)'
      else '50+'

    E com um unico campo de NDOGroup trazer o NDO correspondente:

    datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data]) 

    Eu pensei em algo mais ou menos, deletar registros do campo NDOGroup e NDO me trazendo a menor ou maior

     DELETE a FROM #TARIFASAD AS a, nomes AS b WHERE a.vch_od=b.vch_od AND a.NDOGroup < b.NDOGroup

    sexta-feira, 31 de março de 2017 12:08

Todas as Respostas

  • Bom dia,

    Você pode deletar de varias formas, veja o exemplo abaixo e altere para sua necessidade e teste em um abmbiente de desenvolvimento.

    DECLARE @ID int
    DECLARE @CONT int
    DECLARE CUR_DELETE CURSOR FOR

    SELECT id,COUNT(id) FROM tb GROUP BY id HAVING COUNT(id) > 1

    OPEN CUR_DELETE
    FETCH NEXT FROM CUR_DELETE INTO @ID,@CONT
    WHILE @@FETCH_STATUS = 0
    BEGIN
    DELETE TOP(@CONT -1) FROM tb WHERE ID = @ID
    FETCH NEXT FROM CUR_DELETE INTO @ID,@CONT
    END
    CLOSE CUR_DELETE
    DEALLOCATE CUR_DELETE

    sexta-feira, 31 de março de 2017 11:38
  • Bom dia,

    Você pode deletar de varias formas, veja o exemplo abaixo e altere para sua necessidade e teste em um abmbiente de desenvolvimento.

    DECLARE @ID int
    DECLARE @CONT int
    DECLARE CUR_DELETE CURSOR FOR

    SELECT id,COUNT(id) FROM tb GROUP BY id HAVING COUNT(id) > 1

    OPEN CUR_DELETE
    FETCH NEXT FROM CUR_DELETE INTO @ID,@CONT
    WHILE @@FETCH_STATUS = 0
    BEGIN
    DELETE TOP(@CONT -1) FROM tb WHERE ID = @ID
    FETCH NEXT FROM CUR_DELETE INTO @ID,@CONT
    END
    CLOSE CUR_DELETE
    DEALLOCATE CUR_DELETE

    Será que consigo utilizar já dentro do meu select ali de exemplo?
    sexta-feira, 31 de março de 2017 11:43
  • Deleted
    sexta-feira, 31 de março de 2017 11:43
  • Bom dia,

    Thaís, você não pode utilizar uma função de agregação como a Min ou Max na coluna NDO, removendo desta forma essa coluna do Group By?


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 31 de março de 2017 11:45
  • Bom dia,

    Thaís, você não pode utilizar uma função de agregação como a Min ou Max na coluna NDO, removendo desta forma essa coluna do Group By?


    Assinatura: http://www.imoveisemexposicao.com.br

    Já tentei desta forma e não consegui obter o resultado desejado
    sexta-feira, 31 de março de 2017 11:56
  • O que aconteceu? Como ficou o resultado? O que faltou? Você pode postar mais detalhes? 

    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 31 de março de 2017 12:02
  • Thaís, além de diferenças nas colunas NDO e NDOGroup, o mesmo se observa nas colunas dtt_data_captura, semana, AD e provavelmente em outras que não aparecem no recorte.

    A cláusula GROUP BY geralmente é utilizada para sumarização; entretanto, não há nenhuma função de agregação na lista_de_colunas da cláusula SELECT.

    Poderia postar exemplo de qual é o resultado desejado?


    e-mail       José Diz     Belo Horizonte, MG - Brasil


    Ola

    Hoje meu resultado é este:

    Não tem registro duplicado. Me traz a média tarifada por data de captura (agrupados)

    Preciso inserir as duas colunas NDO, e NDOGroup 

    que são: 

         

    datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data]) AS NDO, 

      case
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '1' then 'NDO 00'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '5' then'(1-4)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '8' then '(5-7)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'15' then '(8-14)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'22' then '(15-21)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'30' then '(22-29)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'50' then '(30-49)'
      else '50+'
      END AS NDOGroup

    Eu entendo que o campo dtt_data, mostrado exemplo abaixo, irá diferenciar. Por mais que dtt_captura seja dia 12/01/2016, em várias linhas o campo dtt_data irá ser diferente. Assim no datadiff acima as vezes vai me dar a diferença de 1 dia, as vezes 3 e assim por diante. 

    Mas gostaria de encontrar uma forma de trazer o NDOGroup de um grupo só sem repetir:

    case
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '1' then 'NDO 00'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '5' then'(1-4)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])< '8' then '(5-7)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'15' then '(8-14)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'22' then '(15-21)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'30' then '(22-29)'
      when datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data])<'50' then '(30-49)'
      else '50+'

    E com um unico campo de NDOGroup trazer o NDO correspondente:

    datediff(dd,QL2.[dtt_data_captura],QL2.[dtt_data]) 

    Eu pensei em algo mais ou menos, deletar registros do campo NDOGroup e NDO me trazendo a menor ou maior

     DELETE a FROM #TARIFASAD AS a, nomes AS b WHERE a.vch_od=b.vch_od AND a.NDOGroup < b.NDOGroup

    sexta-feira, 31 de março de 2017 12:08