Remarques :
- Si votre formule fonctionne réellement dans Excel, vous avez stocké des dates dans des cellules, pas des heures.
- 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 - 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.
- 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 :
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.- opérateur de diffusion
::
changeratime
tapez dansinterval
, afin que nous puissions ajouter du temps et obtenir plus de 24 heures. - Nous comparons le total à un intervalle de 24 heures et affichons une belle étiquette
yes
ouno
.
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