Usuário com melhor resposta
Deletar Registros Duplicados por Group By

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 INDfrom #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 NDOGroupEu 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
- Editado Thaís Sakamoto sexta-feira, 31 de março de 2017 12:17
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?
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 NDOGroupEu 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
- Editado Thaís Sakamoto sexta-feira, 31 de março de 2017 12:16
- Marcado como Resposta Thaís Sakamoto quarta-feira, 5 de abril de 2017 13:49
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 FORSELECT 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 -
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 FORSELECT 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 -
-
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
-
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
-
O que aconteceu? Como ficou o resultado? O que faltou? Você pode postar mais detalhes?
Assinatura: http://www.imoveisemexposicao.com.br
-
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?
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 NDOGroupEu 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
- Editado Thaís Sakamoto sexta-feira, 31 de março de 2017 12:16
- Marcado como Resposta Thaís Sakamoto quarta-feira, 5 de abril de 2017 13:49