AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 308773
Accepted
ahmed elbarbary
ahmed elbarbary
Asked: 2022-03-16 16:30:27 +0800 CST2022-03-16 16:30:27 +0800 CST 2022-03-16 16:30:27 +0800 CST

Como escrever uma declaração selecionada que obtém dados com base no partid da última data até a data atual com o preenchimento de lacunas?

  • 772

Eu trabalho no sql server 2012, enfrento um problema que não consigo select statmentobter o Partid do mês passado até o mês atual march (3).

com base em last dateexistir porpartid

e ao mesmo tempo, se houver algum gaps between dates, preencha-o com base na última data

então se

Encontrei partid com a última data 2022-01-08, então adicionarei 08-02-2022e 08-03-2022como partid6070

e se partidcom data no mês 7e mês seguinte 10e sem data part idno mês 8

e 9 então ele deve exibir isso gapsde acordo com o mês passado, pois partid 1234 tem lacuna.

ambos os casos devem ser aplicados para todos os dados baseados em partid.

Createddateusado abaixo no formato yyyy-mm-dd.

 create table Parts
 (
    
 PartId int,
 CreatedDate date
 )
 insert into Parts(PartId,CreatedDate)
 values
 (1234,'2021-07-03'),
 (1234,'2021-10-05'),
 (1234,'2021-11-05'),
 (5981,'2021-11-15'),
 (5981,'2021-12-03'),
 (6070,'2021-12-12'),
 (6070,'2022-01-08')

eu preciso fazer a select statmentexibição partscomo resultado esperado

green rowsapenas para ficar mais claro que essas peças devem ser adicionadas com peças antigas existentes antes.

Resultado esperado

lacuna de arquivo com datas da última data

o que eu tento

postagem atualizada

código abaixo me dá parte do meu resultado esperado

porque me dá intervalos nulos entre as datas restantes para obter datas até o mês atual

então como fazer isso por favor?

;with cte as (
   select partid, createddate,
          dateadd(month, -1,
                  coalesce(lead(createddate) over (partition by partid order by createddate),
                           max(createddate) over ()
                          )
                 ) as end_month
   from Parts
   union all
   select partid, dateadd(month, 1, createddate), end_month
   from cte
   where createddate <end_month
  )
 select *
 from cte
 order by partid, createddate
sql-server t-sql
  • 1 1 respostas
  • 42 Views

1 respostas

  • Voted
  1. Best Answer
    Patrick Hurst
    2022-03-31T13:57:59+08:002022-03-31T13:57:59+08:00

    Parece que o problema que você está tendo são dados ausentes. Quando não há resultado definido para uma determinada data, não há data para agrupar.

    Para contornar isso, você pode criar um CTE de intervalos que abrange seu intervalo de dados e, em seguida, unir-se a seus dados com uma junção LEFT OUTER. Isso fornece todos os intervalos em seu intervalo para a consulta

    Primeiro, vamos simular alguns dados para testar:

    DECLARE @mockTable TABLE (InvoiceID INT IDENTITY, invoiceDate DATE, invoiceAmount MONEY)
    SET NOCOUNT ON
    WHILE (SELECT COUNT(*) FROM @mockTable) < 300
    BEGIN
     INSERT INTO @mockTable (invoiceDate, invoiceAmount) VALUES (DATEADD(DAY, -ROUND(((89 - 0 -1) * RAND() + 1), 0),CAST(GETDATE() AS DATE)), ((100 - 1 -1) * RAND() + 1) - 1)
    END
    

    @mockTable agora contém 300 linhas de dados gerados aleatoriamente, com datas deste ano. Usando isso, podemos agregar o total de faturas por dia, se houver:

    ;WITH dateRange AS (
    SELECT CAST(CAST(DATEPART(YEAR,CAST(GETDATE() AS DATE)) AS VARCHAR)+'-1-1' AS DATE) AS Interval
    UNION ALL
    SELECT DATEADD(DAY,1,Interval)
      FROM dateRange
     WHERE Interval <= CAST(GETDATE() AS DATE)
    )
    
    SELECT dr.interval, SUM(invoiceAmount) AS totalInvoiceAmount, COUNT(invoiceID) AS totalInvoices
      FROM dateRange dr
        LEFT OUTER JOIN @mockTable mt
          ON dr.Interval = mt.invoiceDate
     GROUP BY dr.Interval
     OPTION (MAXRECURSION 0)
    

    O CTE chamado dateRange contém todas as datas desde o início do ano, até amanhã. A junção dele com seus dados (ou os dados da mockTable) agora produz um resultado para todos os dias nesse intervalo, com uma contagem NULL totalInvoiceAmount e 0 totalInvoices quando não havia faturas para essa data.

    Captura de tela de demonstração

    Você pode aplicar uma técnica semelhante aos seus dados. hth

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve