Ir para conteúdo
  • 0

Duplicar linhas com nova data


Cristiane galdino da silva

Pergunta

9 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
46 minutos atrás, Cristiane galdino da silva disse:

Gente, boa tarde.

Tenho uma consulta SQL que me retorna a tabela, mas quero que fique como a tabela 2.

Quero que o primeiro registro seja repetido, acrescentando um mês a data, até a data da proxima alteração.

Sabem o que posso usar para faser isso?

 

image.png.3e7a72269611633a6992580180b39a5b.png

Qual sgdb você está utilizando?

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Exemplo de aplicação sql server:

Explicação:

1 - DateSeries CTE: Gera uma série de datas começando em '2023-04-01' e incrementando mensalmente até '2024-01-01'.
2 - Data CTE: Define os dados fornecidos no exemplo.
3 - Consulta principal: Junta as datas geradas com os dados originais, garantindo que as datas sejam maiores ou iguais à data de alteração de cada chapa.
4 - ORDER BY: Ordena o resultado por Chapa e data.
5 - OPTION (MAXRECURSION 0): Permite que a CTE recursiva execute sem o limite padrão de 100 recursões.

WITH DateSeries AS (
    SELECT CAST('2023-04-01' AS DATE) AS Date
    UNION ALL
    SELECT DATEADD(MONTH, 1, Date)
    FROM DateSeries
    WHERE DATEADD(MONTH, 1, Date) <= '2024-01-01'
),
Data AS (
    SELECT 'SPV02031008' AS CentroCusto, 24694 AS Chapa, CAST('2023-04-01' AS DATE) AS AlteracaoCentroCusto
    UNION ALL
    SELECT 'SPV0204002', 24694, CAST('2024-01-01' AS DATE)
)
SELECT 
    d.CentroCusto, 
    d.Chapa, 
    ds.Date AS AlteracaoCentroCusto
FROM 
    Data d
JOIN 
    DateSeries ds 
ON 
    ds.Date >= d.AlteracaoCentroCusto
ORDER BY 
    d.Chapa, ds.Date
OPTION (MAXRECURSION 0);

 

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Postado (editado)

Esqueci de mencionar.

A TI não quer fazer nada no banco de dados.

Eu uso um sistema que me permite fazer as querys, mas não consigo criar CTEs , TB temporária.

 

Pensei em fazer algo dentro do Power Query também, mas ainda não consegui chegar a uma solução.

Editado por Cristiane galdino da silva
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
15 horas atrás, Cristiane galdino da silva disse:

Esqueci de mencionar.

A TI não quer fazer nada no banco de dados.

Eu uso um sistema que me permite fazer as querys, mas não consigo criar CTEs , TB temporária.

 

Pensei em fazer algo dentro do Power Query também, mas ainda não consegui chegar a uma solução.

Tenho essa solução tente replicar seu conjunto de dados:
 

 

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
2 horas atrás, Alex Pereira disse:

Tenho essa solução tente replicar seu conjunto de dados:
 

 

Alex, bom dia.

Obrigada pela ajuda. 

O código M que vc compartilhou comigo está dando estouro de pilha. Acredito eu que seja porque a tabela original possui 13000 linhas.

Como eu quero que seja retornada apenas uma data em cada mês, troquei a duração para 30, porque só preciso saber o mês e o ano que teve a alteração.

Vou te enviar o arquivo em Excel, pode ver se consegue me ajudar?

 

Alteracao_centro_custo.xlsx

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Você quer que repita só nos casos numero de matricula é igual?  Ex:

SPV01000001    14    18/03/2024
SPV02062002    14    01/01/2013

Resultado esperado:

SPV02062002    14    01/01/2013
SPV02062002    14    01/02/2013
SPV02062002    14    01/03/2013
.
.
.
SPV02062002    14    01/01/2024
SPV02062002    14    01/02/2024
SPV01000001    14    18/03/2024

image.png

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
54 minutos atrás, Alex Pereira disse:

Você quer que repita só nos casos numero de matricula é igual?  Ex:

SPV01000001    14    18/03/2024
SPV02062002    14    01/01/2013

Resultado esperado:

SPV02062002    14    01/01/2013
SPV02062002    14    01/02/2013
SPV02062002    14    01/03/2013
.
.
.
SPV02062002    14    01/01/2024
SPV02062002    14    01/02/2024
SPV01000001    14    18/03/2024

image.png

Isso mesmo.

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Segue Codigo Atualizado:

 

let
    Fonte = Table.FromRecords({
        [ALTERACAO_CENTRO_CUSTO=#date(2022, 1, 11), MATRICULA=12981, CENTRO_CUSTO=1347.38],
        [ALTERACAO_CENTRO_CUSTO=#date(2022, 1, 13), MATRICULA=12981, CENTRO_CUSTO=1891.89],
        [ALTERACAO_CENTRO_CUSTO=#date(2022, 1, 15), MATRICULA=12981, CENTRO_CUSTO=1891.89],
        [ALTERACAO_CENTRO_CUSTO=#date(2022, 1, 14), MATRICULA=12981, CENTRO_CUSTO=1247.38],
        [ALTERACAO_CENTRO_CUSTO=#date(2022, 2, 16), MATRICULA=12981, CENTRO_CUSTO=1347.38]
    }), // Substitua pela sua fonte de dados original
    Ordenado = Table.Sort(Fonte, {{"MATRICULA", Order.Ascending}, {"ALTERACAO_CENTRO_CUSTO", Order.Ascending}}),
    MatriculasUnicas = List.Distinct(Ordenado[MATRICULA]),
    TabelaExpandida = List.Accumulate(
        MatriculasUnicas,
        Table.FromRecords({}),
        (tabela, matriculaAtual) => 
            let
                Filtrado = Table.SelectRows(Ordenado, each [MATRICULA] = matriculaAtual),
                MinData = List.Min(Filtrado[ALTERACAO_CENTRO_CUSTO]),
                MaxData = List.Max(Filtrado[ALTERACAO_CENTRO_CUSTO]),
                QtdDias = Duration.Days(MaxData - MinData),
                DatasFiltrado = List.Dates(MinData, QtdDias + 1, #duration(1, 0, 0, 0)),
                Expandido = List.Accumulate(
                    DatasFiltrado,
                    tabela,
                    (tabelaInterna, dataAtual) =>
                        let
                            Linha = Table.SelectRows(Filtrado, each [ALTERACAO_CENTRO_CUSTO] <= dataAtual),
                            UltimaLinha = Table.Last(Linha),
                            ListaDeValores = {dataAtual, UltimaLinha[MATRICULA], UltimaLinha[CENTRO_CUSTO]},
                            NovoRegistro = Record.FromList(ListaDeValores, {"ALTERACAO_CENTRO_CUSTO", "MATRICULA", "CENTRO_CUSTO"}),
                            ListaDeRegistros = Table.ToRecords(tabelaInterna)
                        in
                            Table.FromRecords(ListaDeRegistros & {NovoRegistro})
                )
            in
                Expandido
    )
in
    TabelaExpandida

 

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...