sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:asigne valor a cada fila según los criterios

Notas:

  1. Si su fórmula realmente funciona en Excel, entonces ha almacenado fechas en celdas, no tiempo.
  2. Para D, E , no entiendo, cómo esto debería devolver 'sí' cuando la fila anterior no tiene la misma etiqueta
  3. Tienes que agregar alguna columna con ID a tu tabla (!). Mientras que Excel mantiene el mismo orden de filas en la hoja (a menos que lo cambie explícitamente), PostgreSQL no lo hace. Por lo tanto, si realmente solo tiene tiempo en la columna, entonces no hay forma de que pueda obtener el mismo orden de filas que tiene en su tabla, lo que genera resultados completamente incorrectos.
  4. Si está usando la versión 8.4, entonces su enlace es correcto, sin embargo, sería mejor si usa el actual documentación

Datos:

drop table if exists tmp.test;

create table tmp.test (id int, ddate date, label varchar, ttime time);

insert into tmp.test values

(1, '2014/6/4','A','12:05:56'),
(2, '2014/6/4','A','23:02:32'),
(3, '2014/6/4','B','8:39:25'),
(4, '2014/6/4','B','12:36:37'),
(5, '2014/6/4','C','12:20:43'),
(6, '2014/6/4','C','12:56:44'),
(7, '2014/6/4','D','20:52:22'),
(8, '2014/6/4','E','22:25:30'),
(9, '2014/6/4','F','12:16:15'),
(10, '2014/6/4','F','12:31:09'),
(11, '2014/6/4','F','7:12:06'),
(12, '2014/6/4','G','7:48:32'),
(13, '2014/6/4','H','17:58:11');

Consulta:

select
  id, 
  ddate,
  label,
  ttime,
  case when (lag(ttime) over(partition by label order by id))::interval
        + ttime::interval > interval '24 hours' then 'yes' else 'no' end
  -- ,(lag(ttime) over(partition by label order by ttime))::interval + ttime::interval
from
  tmp.test

Explicación:

  1. lag la función obtendrá el valor en la fila anterior para la partición dada. En nuestro caso, la partición se define por etiqueta.
  2. operador de conversión :: cambiará time escribe en interval , por lo que podemos agregar tiempo y obtener más de 24 horas.
  3. Comparamos el total con un intervalo de 24 horas y mostramos una bonita etiqueta yes o no .

Actualización:

select
  id, 
  ddate,
  label,
  ttime,
  case when lead(label) over(partition by label order by id) is null then 'no' else 'yes' end
from
  tmp.test