Cómo devolver la fecha de la segunda más baja

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Notael Jue, 18 Oct 2007 9:28 am

Tengo una tabla con código y datos, donde el código se repite para diferentes fechas.
Si hago el minuto (datos), código obtengo los datos más pequeños por código.
Pero necesito la fecha de la segunda más baja.
Al principio hice un seleccione regresar la fecha más baja dentro de un select usando no en y luego seleccione la fecha segundo menor regresar ejemplo principal:
Código: Seleccionar todo
select min(data),codigo
from tabela
where codigo in (select codigo
                 from tabela
                 where codigo not in (select a.codigo
                                      from tabela a
                                      where data in (select min(b.data)
                                                     from tabela b
                                                     where  b.codigo =  a.codigo)
hay alguna forma más simple para volver a la 2 º fecha menor???

Agradecido
brauliomsf
Ubicación: SP

Braulio Moizes

Notael Jue, 18 Oct 2007 9:59 am

prueba allí
Código: Seleccionar todo
select  min(a.data),a.codigo
  from  tabela a
where  a.data > (select min(b.data)
                            from tabela b
                          where b.codigo = a.codigo)
rodfbar
Ubicación: Batatais - SP

Notael Jue, 18 Oct 2007 6:50 pm

¿Por lo que entiendo de tu consulta, regresan todos los códigos con la fecha de mesa más pequeño segundo, derecha?

Código: Seleccionar todo
select codigo
     , data
from
(
  select t.codigo
       , t.data
       , dense_rank() over (order by t.data asc) posicao
  from   tabela t
)
where  posicao = 2
;
no tengo manera para poner a prueba esta consulta en el momento, pero creo que funciona: D
rogenaro
Ubicación: Londrina - PR

Rafael O. Genaro

Notael Lun, 05 Nov 2007 1:10 pm

Kara... creo que também "ROWNUM". ¡TRATE DE aí!

falou
Código: Seleccionar todo
select codigo, data
  from (select t.codigo, t.data, rownum posicao
          from tabela t
         order by t.data asc)
where posicao = 2;
!
Renan Orati
Ubicación: São José do Rio Preto - SP

Notael Lun, 05 Nov 2007 6:57 pm

kara... creo que "ROWNUM" también hacerlo. ¡TRATE de allí!

Código: seleccionar código, datos (seleccione t., t., fecha código numLinea posición del orden de t de tabla por fecha t. asc) posición donde = 2;


¡dijo!!!!


Sólo una corrección: el rownum es generado antes de la ejecución de la orden por la cláusula, tan el expediente devuelto puede no ser la fecha en segundo lugar más pequeña... Tendría que añadir un nivel más en la consulta:
Código: Seleccionar todo
select codigo, data
from 
(
  select rownum posicao, a.*
  from
  (
    select t.codigo, t.data
    from   tabela t
    order by t.data asc
  ) a
)
where posicao = 2;
rogenaro
Ubicación: Londrina - PR

Rafael O. Genaro

Notael Jue, 06 Dic 2007 12:41 pm

personalmente, tengo una duda con respecto a las fechas en un Select, y les dejo aquí para no crear un nuevo hilo sólo para esto: esta es mi selección interna:
Código: Seleccionar todo
SELECT Max(g.lora_dt) Ultima_Ligacao
  FROM gelogramal g, rhfunc
WHERE g.func_cd = rhfunc.func_cd
   AND g.empr_cd = rhfunc.empr_cd
   AND g.inra_ddd = '43'
   AND g.inra_nr = '33210710'
   AND g.lora_dt NOT BETWEEN To_Date('01/12/2007','DD/MM/YYYY')
                      AND To_Date('30/12/2007','DD/MM/YYYY');
devuelve: ULTIMA_LIGACAO 09/10/2007 12:00 si le pongo en que SQL, devuelve los 2 registros (!)
Código: Seleccionar todo
SELECT rhpessoa.pess_nm_nome,
       rhfunc.func_cd,
       gelogramal.lora_dt
  FROM rhpessoa, rhfunc, gelogramal
WHERE rhfunc.pess_cd = rhpessoa.pess_cd
   AND gelogramal.func_cd = rhfunc.func_cd
   AND gelogramal.empr_cd = rhfunc.empr_cd
   AND gelogramal.inra_ddd = '43'
   AND gelogramal.inra_nr = '33210710'
   AND gelogramal.lora_dt NOT BETWEEN To_Date('01/12/2007','DD/MM/YYYY')
                                  AND To_Date('30/12/2007','DD/MM/YYYY')

   AND gelogramal.lora_dt = (SELECT Max(g.lora_dt) Ultima_Ligacao
                          FROM gelogramal g
                         WHERE g.func_cd = rhfunc.func_cd
                           AND g.empr_cd = rhfunc.empr_cd
                           AND g.inra_ddd = gelogramal.inra_ddd
                           AND g.inra_nr = gelogramal.inra_nr
                           AND g.lora_dt NOT BETWEEN To_Date('01/12/2007','DD/MM/YYYY')
                                                       AND To_Date('30/12/2007','DD/MM/YYYY'))


      AND gelogramal.lora_bo_particular = 'S';
Código: Seleccionar todo
FULANO 1   01/09/2007 10:04:00
FULANO 2   10/09/2007 12:00:00 --Deveria retornar somente esse registro! (maior data)
porque pasa esto?!, si el interno Select devuelve la fecha más grande (SELECT Max (g. lora_dt) Ultima_Ligacao), porque la comparación no funciona?!?!?!
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Notael Jue, 06 Dic 2007 2:03 pm

Y prueba, hombre por q que entiendo que su principal seleccione Lee una tabla de empleados y la subconsulta q existe en donde está vinculado al funcionario também... ¿de esta manera Mostrar más de un registro será q es?

[de]
Tineks
Ubicación: Araraquara - SP

Cristiano (Tineks)
Araraquara - SP

Notael Jue, 06 Dic 2007 2:55 pm

Cristiano, se me quitan aquí la comparación entre empleado y empresa y funcinou, pero tengo algunos discos en este caso, mi miedo es: no necesito relacionar lo interno con el externo, seleccione??? la selección interna no va a traerme un max (fecha) a otro registro que no tiene nada que hacer?, no sé bien la lógica del mecanismo. \":(\"
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Notael Jue, 06 Dic 2007 3:06 pm

Por lo tanto, no entiendo lo que usted realmente necesita
¿la consulta debe obtener a todos los empleados y la fecha más importante de cada uno o sólo la fecha más grande entre todos?

[de]
Tineks
Ubicación: Araraquara - SP

Cristiano (Tineks)
Araraquara - SP

Notael Jue, 06 Dic 2007 3:28 pm

los datos más grande entre todos permiten ser más claro y explicar el lío: tengo extensiones que control de obras como sigue, cuando la conexión es privada del empleado, la empresa cobra por ella, imagino que en el período del 09/01/2007 al 30/09/2007 la funcionári FABIO y RAFAEL funcionario llamó por un teléfono que no es un contacto de la empresa, un amigo suyo por ejemplo cuyo número de teléfono es: 43 33334444: se llama en la siguiente secuencia: nombre fecha fecha/nº tel---FABI El 09/01/2007 43 RAFAEL 33334444 10/09/2007 43 33334444 cuando el usuario pide un filtro de los enlaces del mês de diciembre de 2007, otra vez verificar si hay registros de este teléfono externo (33334444 43) a del período informado y tiene empleado rel incendios *, para los casos de empleados que ya corresponden a ese número, aí en el bloque traería este vendedor tabular con un color diferente, lo que sugiere que el número pertenece a él, lo que quiero es traer un empleado solamente, en este caso, la última una llamé a este número.

DAE que pensaron en hacer una Select para volver al último hecho pro teléfono (33334444 43) y que es con el funcioário ya conectado en la parte posterior, en el mês de septiembre el jefe del Departamento de empleado enumera como sigue, los registros se muestran en un paquete multi grabar y pasa una lista en papel incluso, por el Departamento para cada vendedor en tus enlaces, aí los vínculos de usuario (en el sistema) estas llamadas a los empleados.
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Notael Jue, 06 Dic 2007 3:43 pm

Mira aí Cristiano, para ser más visual la cosa cuando le pregunto por la gama de diciembre (01 a 31), otra vez va a tener este teléfono '33210710', que les traigo el último oficial que lo llamó, en este caso, incluso en el ejemplo...

[img]http%20&%20#58;%20//img523%20&%20#46;%20imageshack%20&%20#46;%20$/%20img523/5052/ramaisez8%20&%20#46;%20jpg[/img]
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Notael Jue, 06 Dic 2007 5:27 pm

¿Y allí prueba, belleza?
Loco, echa un vistazo a este código, ver si tiene +-

Código: Seleccionar todo
SQL> select * from mens_erro;

NOME                                     DATA      TEL
---------------------------------------- --------- ---------------
Fabio                                    01-SEP-07 43 33334444
Rafael                                   10-SEP-07 43 33334444

SQL> SELECT a.*, nvl2(b.maxdata,'Ultimo',null) flag
  2    FROM mens_erro a,
  3         (SELECT MAX (DATA) maxdata
  4            FROM mens_erro) b
  5   WHERE a.DATA BETWEEN TO_DATE ('01/09/2007', 'DD/MM/YYYY')
  6                    AND TO_DATE ('30/09/2007', 'DD/MM/YYYY')
  7     AND a.data = b.maxdata(+)
  8  /

NOME                                     DATA      TEL             FLAG
---------------------------------------- --------- --------------- ------
Rafael                                   10-SEP-07 43 33334444     Ultimo
Fabio                                    01-SEP-07 43 33334444
[de]
Tineks
Ubicación: Araraquara - SP

Cristiano (Tineks)
Araraquara - SP

Notael Vie, 07 Dic 2007 7:57 am

Cristiano, estaba con la cabeza caliente ayer y no era capaz de pensar correctamente!, lo hice simple incluso, como fue relativa a consulta interna con los empleados y traía en más de un registro por lo que acabo de hacer los dos consultas casi idénticas, pero el interno con MAX y relacionadas con en la propia consulta con el empleado:
Código: Seleccionar todo
SELECT rhpessoa.pess_nm_nome,
       rhfunc.func_cd,
       gelogramal.lora_dt
  FROM rhpessoa, rhfunc, gelogramal
WHERE rhfunc.pess_cd = rhpessoa.pess_cd
   AND gelogramal.func_cd = rhfunc.func_cd
   AND gelogramal.empr_cd = rhfunc.empr_cd
   AND gelogramal.lora_dt = (  SELECT Max(g.lora_dt)
                                 FROM gelogramal g, rhfunc f --relacionei internamente RHFUNC
                                WHERE g.func_cd  = f.func_cd
                                  AND g.empr_cd  = f.empr_cd
                                  AND g.inra_ddd = '43'
                                  AND g.inra_nr  = '33210710'
                                  AND g.lora_bo_particular = 'S'
                                  AND g.lora_dt NOT BETWEEN TO_DATE('01/12/2007','DD/MM/YYYY')
                                                        AND TO_DATE('30/12/2007','DD/MM/YYYY') );
ahora una curiosidad, como Oracle procede en este caso, se ejecuta la consulta interna primero???
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Notael Vie, 07 Dic 2007 8:14 am

¿Así que prueba, guy beleza?

Después, creo, no es que lea primero el interno pero, creo que he iniciar el análisis, de abajo hacia arriba.

Corregirme si me equivoco.
Trevisolli
Ubicación: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Notael Vie, 07 Dic 2007 8:18 am

¿Y allí, derecho?

Hombre, pones en el rhfunc de la tabla de la subconsulta, es relacionarse con gelogramal, pero esta relación creo que es innecesario porque no estás realizando ningún filtro en rhfunc, y também no es usando cualquier campo con la consulta externa...
Ahora usted tiene una duda sobre este extracto aquí.
Código: Seleccionar todo
... AND gelogramal.lora_dt = (  SELECT Max(g.lora_dt) ...
haciendo así sólo conseguirá el ultimo usuario que hizo el enlace!!!??? ¿... es ese derecho? o tendría que ser una combinación externa en ese momento.

[de]
Tineks
Ubicación: Araraquara - SP

Cristiano (Tineks)
Araraquara - SP

Notael Vie, 07 Dic 2007 8:29 am

se pone, verdadero hombre, viajó otra vez!

y sí, sólo hay que traer 1 empleado, el última llamado 'MAX (fecha)' para que lo que estás follando dibujar, cuz si me relacino la consulta interna con la externa, aí cae en ese caso para traer más de 1 empleado, y sucede que no hay que olvidar el post de mi aí SQL por encima está mal: roll:
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Notael Vie, 07 Dic 2007 8:53 am

Incluso intenté a:
Código: Seleccionar todo
SELECT rhpessoa.pess_nm_nome,
       rhfunc.func_cd,
       gelogramal.lora_dt
  FROM rhpessoa, rhfunc, gelogramal
WHERE rhfunc.pess_cd = rhpessoa.pess_cd
   AND gelogramal.func_cd = rhfunc.func_cd
   AND gelogramal.empr_cd = rhfunc.empr_cd
   AND gelogramal.inra_ddd = '43'
   AND gelogramal.inra_nr  = '33210710'
   AND gelogramal.lora_bo_particular = 'S'
   AND gelogramal.lora_dt NOT BETWEEN To_Date('01/12/2007','DD/MM/YYYY')
                                  AND To_Date('30/12/2007','DD/MM/YYYY')
   AND ROWNUM < 2
ORDER BY gelogramal.lora_dt DESC;
pero ejecuta el ROWNUM antes de ORDER BY, aí es el mismo!
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Notael Vie, 07 Dic 2007 10:24 am

soluciona aquí, acaba de tomar la relación de consulta interna con el externo, gracias por tu paciencia aí (y)
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Notael Vie, 07 Dic 2007 10:32 am

Chico, lo sentimos tomó tanto tiempo para responder, soy q hj escondido aquí. jejejejej []!
Tineks
Ubicación: Araraquara - SP

Cristiano (Tineks)
Araraquara - SP

Notael Vie, 07 Dic 2007 12:15 pm

el meo loco, jeje, fue útil, gracias una vez más pidieron un bozão chico de SQL que trabaja aquí, pero estaba de vacaciones pensé:) debe tener esta conexión entre las dos instrucciones select, pero no: S
Porva
Ubicación: São Paulo/SP

Rafael S. Nunes
São Paulo/SP


  • See also
    Replies
    Views
    Last Post

      Siguiente

      Volver a SQL

      ¿Quién está conectado?

      Usuarios navegando por este Foro: Google [Bot] y 5 invitados