PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL - Atribui valor a cada linha com base em critérios


Notas:
  1. Se sua fórmula realmente funcionar no Excel, você armazenou datas nas células, não na hora.
  2. Para D, E , não entendo, como isso deve retornar 'sim' quando a linha anterior não possui o mesmo rótulo
  3. Você precisa adicionar alguma coluna com ID à sua tabela (!). Enquanto o Excel mantém a mesma ordem de linhas na planilha (a menos que você a altere explicitamente), o PostgreSQL não. Assim, se você realmente tiver apenas tempo no tempo da coluna, não há como obter a mesma ordem de linhas que você tem em sua tabela, levando a resultados completamente incorretos.
  4. Se você estiver usando a versão 8.4, seu link está correto, mas seria melhor se você usasse documentação

Dados:
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

Explicação:
  1. lag A função obterá o valor na linha anterior para determinada partição. No nosso caso, a partição é definida por rótulo.
  2. operador de transmissão :: mudará time digite em interval , para que possamos adicionar tempo e obter mais de 24 horas.
  3. Comparamos o total com o intervalo de 24 horas e exibimos um bom rótulo yes ou no .

Atualizar:
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