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 / 321136
Accepted
Rishav Ghosh
Rishav Ghosh
Asked: 2022-12-19 06:44:00 +0800 CST2022-12-19 06:44:00 +0800 CST 2022-12-19 06:44:00 +0800 CST

Gerar datas usando cte recursivo

  • 772

tenho uma mesa de vendas

product_id  period_start  period_end  sale
----------------------------------------
1          2019-01-25    2019-02-28   100
2          2018-12-01    2020-01-01   10
3          2019-12-01    2020-01-31   1

Eu quero uma saída como:

product_id  period_start  period_end  sale
----------------------------------------
1          2019-01-25    2019-02-28   100
1          2019-01-26    2019-02-28   100
1          2019-01-27    2019-02-28   100
.               .            .         .
.               .            .         .
1          2019-02-28    2019-02-28   100
2          2018-12-01    2020-01-01   10
2          2018-12-02    2020-01-01   10
.               .            .         .
.               .            .         .
2          2020-01-01    2020-01-01   10
3          2019-12-01    2020-01-31   1
3          2019-12-02    2020-01-31   1
.               .            .         .
.               .            .         .
3          2020-01-31    2020-01-31   1

Eu tentei o abaixo, mas não parece funcionar

with alldates as(
  select * from sales
  union all
  select product_id, dateadd(day, 1, period_start) as period_start, period_end, average_daily_sales
  from  alldates
  where period_start < period_end
)

Qualquer maneira de conseguir isso usando cte recursivo?

DDL:

create table sales (
product_id int,
period_start date,
period_end date,
average_daily_sales int
);

insert into sales values(1,'2019-01-25','2019-02-28',100),(2,'2018-12-01','2020-01-01',10),(3,'2019-12-01','2020-01-31',1);
sql-server
  • 1 1 respostas
  • 42 Views

1 respostas

  • Voted
  1. Best Answer
    Sabin B
    2022-12-19T07:44:28+08:002022-12-19T07:44:28+08:00

    Basta adicionar option(maxrecursion 0)ao seu finalselect

    with alldates as(
      select * from sales
      union all
      select product_id, dateadd(day, 1, period_start) as period_start, period_end, average_daily_sales
      from  alldates
      where period_start < period_end
    )
    SELECT *
    FROM allDates
    option(maxrecursion 0);
    

    dbfiddle

    Mas, sugiro ter uma tabela de calendário ou uma tabela de contagem e usar essa tabela de utilidade para escrever a consulta.

    Eu usei master..spt_values apenas como amostra, mas você deve usar uma tabela utilitária

    ;with tallyTable as 
    (select number
      from master..spt_values
       where type ='p'
    )
    SELECT s.product_id,dateadd(day,tt.number, s.period_start) as period_start, s.period_end,s.average_daily_sales
    FROM tallyTable as tt
         INNER JOIN sales as s
               on dateadd(day,tt.number, s.period_start)<= s.period_end
    ORDER BY product_id,period_start 
    

    veja mais neste link
    https://www.mssqltips.com/sqlservertip/5111/fix-sql-server-cte-maximum-recursion-exhausted-error/
    para tally table
    https://www.sqlservercentral.com/blogs/tally -tables-in-t-sql

    https://sqlbenjamin.wordpress.com/2018/02/06/sql-tip-the-tally-table/

    • 2

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