Oracle - Contar registros en cada momento del tiempo

 
Vista:

Contar registros en cada momento del tiempo

Publicado por belloweb (2 intervenciones) el 05/04/2018 10:42:03
Buenas, tengo una tabla con las siguientes características:

CODIGO | FECHA_INICIO_VIGENCIA | FECHA_FIN_VIGENCIA
1 | 01/03//18 | 31/12/00
2 | 02/03/18 | 03/03/18
3 | 03/03/18 | 31/12/00
4 | 01/03/18 | 03/03/18

La fecha 31/12/00 quiere decir que no tiene fecha de fin de vitgencia (es decir, que el registro está vigente = 31/12/2500). Lo que quiero es obtener para cada día del mes, cuántos registros han estado vigentes en ese momento.

Fecha | Cuenta_vigentes
01/03/18 | 2
02/03/18 | 3
03/03/18 | 2
04/03/18 | 2
05/03/18 | 2
.
.
.
31/03/18 | 2

No se si es posible obtener esto ya que agrupar por los días del mes... es algo que no me encaja muy bien en la estructura del Group by. ¿Alguna idea de cómo hacerlo?

Mil gracias :)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Contar registros en cada momento del tiempo

Publicado por belloweb (2 intervenciones) el 05/04/2018 12:16:44
La primera solución que he encontrado... de forma "manual" y ordenando por meses, que sino nos volvemos locos:

select
count(case when fecha_fin_vigencia >= '01/01/18' then 1 end) as Enero,
count(case when fecha_fin_vigencia >= '01/02/18' then 1 end) as Febrero,
count(case when fecha_fin_vigencia >= '01/03/18' then 1 end) as Marzo,
count(case when fecha_fin_vigencia >= '01/04/18' then 1 end) as Abril
from myDB

Obtengo lo siguiente:

enero | febrero | marzo | abril
20499 | 19855 | 19100 | 1800

De momento me vale para sacar volumetrías mensuales...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de gilman
Val: 117
Bronce
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Contar registros en cada momento del tiempo

Publicado por gilman (52 intervenciones) el 12/04/2018 16:04:48
Primero comentarte que la sentencia que das no es correcta, ya que contaría como vigentes en enero todos los registros del ejemplo, aunque todavía no estaban vigentes ya que su inicio de vigencia es posterior al 31/01/2018
En cuanto al problema original, obtener los vigentes a una determinada fecha en un periodo de fechas prueba:
1
2
3
4
5
6
7
8
9
SELECT FECHA, COUNT (CODIGO) VIGENTES
    FROM MYBD,
         (SELECT :FECHAINI - 1 + ROWNUM FECHA
            FROM OTRATABLA TABLA_AUX
           WHERE ROWNUM < :DIAS)
   WHERE FECHA BETWEEN MYBD.FECHA_INICIO_VIGENCIA
                   AND NVL (MYBD.FECHA_FIN_VIGENCIA, SYSDATE)
GROUP BY FECHA
ORDER BY FECHA
:FECHAINI es un parámetro de tipo DATE que indica la fecha inicial.
:DIAS indica el número de dias del periodo.
OTRATABLA es una tabla cualquiera, que debe tener al menos tantos registros como días tiene el periodo.
Ten en cuenta que la consulta no devolverá datos para las fechas en que no hay registros vigentes.

Yo no aconsejaría usar un periodo excesivamente largo por temas de rendimiento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar