PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL - Attribuez une valeur à chaque ligne en fonction de critères

Remarques :

  1. Si votre formule fonctionne réellement dans Excel, vous avez stocké des dates dans des cellules, pas des heures.
  2. Pour D, E , je ne comprends pas, comment cela devrait retourner 'oui' lorsque la ligne précédente n'a pas la même étiquette
  3. Vous devez ajouter une colonne avec ID à votre table (!). Alors qu'Excel conserve le même ordre de lignes dans la feuille (sauf si vous le modifiez explicitement), PostgreSQL ne le fait pas. Ainsi, si vous n'avez vraiment que du temps dans le temps de colonne, il n'y a aucun moyen d'obtenir le même ordre de lignes que celui que vous avez dans votre tableau, ce qui entraînerait des résultats complètement incorrects.
  4. Si vous utilisez la version 8.4, votre lien est correct, mais il serait préférable d'utiliser l'actuel documentation

Données :

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');

Requête :

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

Explication :

  1. lag la fonction obtiendra la valeur dans la ligne précédente pour la partition donnée. Dans notre cas, la partition est définie par l'étiquette.
  2. opérateur de diffusion :: changera time tapez dans interval , afin que nous puissions ajouter du temps et obtenir plus de 24 heures.
  3. Nous comparons le total à un intervalle de 24 heures et affichons une belle étiquette yes ou no .

Mise à jour :

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