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 / 193030
Accepted
Elio Fernandes
Elio Fernandes
Asked: 2017-12-14 08:26:52 +0800 CST2017-12-14 08:26:52 +0800 CST 2017-12-14 08:26:52 +0800 CST

Contar o total de ocorrências para cada dia em determinadas datas

  • 772

Tenho esta tabela e não tenho SQL suficiente para fazer uma consulta para obter o resultado mostrado na imagem abaixo.

CREATE TABLE myDates (
    id integer NOT NULL,
    startDate date NOT NULL,
    endDate date NOT NULL
);

insert into myDates(id, startDate, endDate)
values
(1, '2017-12-26', '2017-12-29'),
(2, '2017-12-29', '2017-12-29'),
(3, '2017-12-14', '2017-12-29'),
(4, '2017-12-18', '2017-12-21'),
(5, '2017-12-26', '2017-12-29'),
(6, '2017-12-28', '2017-12-29'),
(7, '2017-12-26', '2017-12-29'),
(8, '2017-12-25', '2017-12-27')

Veja todos os dias entre 'startDate' e 'endDate' e conte o total de ocorrências por dia:

Resultado esperado insira a descrição da imagem aqui

Acabei de adicionar esta imagem de um arquivo do Excel para ilustrar melhor o que estou tentando alcançar. Estou migrando do Excel para o SQL. Ignore finais de semana e 22/12 e 25/12.

insira a descrição da imagem aqui

Regrads, Elio Fernandes

count
  • 2 2 respostas
  • 1339 Views

2 respostas

  • Voted
  1. Scott Hodgin - Retired
    2017-12-14T10:12:31+08:002017-12-14T10:12:31+08:00

    Aqui está uma abordagem baseada em conjunto que usa uma expressão de tabela comum (CTE) para gerar uma tabela de dimensão de data rápida e, em seguida, usamos a CTE para agrupar por data

    A resposta é a mesma que @nates

    Declare @myDates TABLE  (
        id integer NOT NULL,
        startDate date NOT NULL,
        endDate date NOT NULL
    );
    
    insert into @myDates(id, startDate, endDate)
    values
    (1, '2017-12-26', '2017-12-29'),
    (2, '2017-12-29', '2017-12-29'),
    (3, '2017-12-14', '2017-12-29'),
    (4, '2017-12-18', '2017-12-21'),
    (5, '2017-12-26', '2017-12-29'),
    (6, '2017-12-28', '2017-12-29'),
    (7, '2017-12-26', '2017-12-29'),
    (8, '2017-12-25', '2017-12-27')
    ;
    
    WITH dates ([Date])
    AS (
        SELECT convert(DATE, '2017-01-01') AS [Date] -- Put the start date here
    
        UNION ALL
    
        SELECT dateadd(day, 1, [Date])
        FROM dates
        WHERE [Date] <= '2020-12-31' -- Put the end date here 
        )
    SELECT [Date]
        ,count(*)
    FROM dates d
    JOIN @myDates m ON d.[Date] >= m.startDate
        AND d.[Date] <= m.endDate
    GROUP BY [Date]
    OPTION (MAXRECURSION 32767) -- Don't forget to use the maxrecursion option!
    
    • 4
  2. Best Answer
    NateJ
    2017-12-14T09:43:55+08:002017-12-14T09:43:55+08:00

    Esta é uma abordagem bastante "procedural", em oposição ao RDBMS baseado em conjunto/puro, mas deve funcionar. Basicamente, você cria uma "tabela de frequência" que rastreia quantas vezes sua tabela de origem tem uma linha que contém "uma data", para cada data de minaté max. Código de exemplo criado para seguir o seu (ou seja, você já criou sua myDatestabela e a preencheu com dados).

    CREATE TABLE #DateFrequency (theDate date, freq int);
    --TRUNCATE TABLE #DateFrequency;
    
    DECLARE @theDate date, @maxDate date;
    SELECT @theDate = MIN(startDate), @maxDate = MAX(endDate)
        FROM myDates
    
    WHILE (@theDate <= @maxDate)
    BEGIN
        INSERT INTO #DateFrequency (theDate, freq)
        SELECT @theDate, COUNT(id)
        FROM myDates
        WHERE @theDate BETWEEN startDate AND endDate;
    
        SET @theDate = DATEADD(DAY, 1, @theDate);
    END
    
    SELECT * FROM #DateFrequency;
    --DROP TABLE #DateFrequency;
    

    Em seguida, faça o que for necessário com os dados em #DateFrequency; torne-a uma tabela permanente (em vez de #temporary) se precisar.

    PS: leia esta postagem no blog de Aaron Bertrand sobre como lidar com intervalos de datas; não é direcionado diretamente ao seu problema porque você (corretamente) usou o Datetipo em vez de DateTime, mas ainda é o que considero leitura obrigatória se você estiver lidando com esse tipo de dados e esses tipos de consultas.

    • 1

relate perguntas

  • Contando resultados para junção cruzada

  • Select Count(*) FROM with-clause-named table order by a, b not work

  • Necessidade de contar registros e contagem de grupos por data no Oracle

  • como obter count(*) da tabela que possui coluna ou não?

  • SELECT COUNT GROUP BY é mais eficiente do que contar um conjunto de resultados?

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