sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL - Tildel værdi til hver række baseret på kriterier

Bemærkninger:

  1. Hvis din formel faktisk fungerer i Excel, har du gemt datoer i celler, ikke tid.
  2. For D, E , Jeg forstår ikke, hvordan dette skal returnere 'ja', når forrige række ikke har samme etiket
  3. Du skal tilføje en kolonne med ID til din tabel (!). Mens Excel beholder den samme rækkefølge af rækker i arket (medmindre du eksplicit ændrer det), gør PostgreSQL det ikke. Således, hvis du virkelig kun har tid i kolonnetid, er der ingen måde, du kan få den samme rækkefølge af rækker, som du har i din tabel, hvilket fører til helt forkerte resultater.
  4. Hvis du bruger version 8.4, er dit link korrekt, men det ville være bedre, hvis du bruger den nuværende dokumentation

Data:

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

Forespørgsel:

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

Forklaring:

  1. lag funktion vil få værdi i forrige række for en given partition. I vores tilfælde er partitionen defineret af label.
  2. cast-operatør :: vil ændre time skriv i interval , så vi kan tilføje tid og få mere end 24 timer.
  3. Vi sammenligner det samlede antal med 24 timers interval og viser en flot etiket yes eller no .

Opdatering:

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



  1. mysql-transaktion - blander indsæt og vælg for at opnå last_insert_id?

  2. SQL:transformer rækker til kolonner i MySQL (SELECT-sætning)

  3. Hvordan synkroniserer jeg to Oracle-databaser?

  4. Sådan beregnes forskellen mellem to datoer i SQLite