sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL - Tilldela värde till varje rad baserat på kriterier

Anmärkningar:

  1. Om din formel faktiskt fungerar i Excel, har du lagrat datum i celler, inte tid.
  2. För D, E , jag förstår inte hur detta ska returnera "ja" när föregående rad inte har samma etikett
  3. Du måste lägga till någon kolumn med ID i din tabell (!). Medan Excel behåller samma ordning på rader i arket (såvida du inte ändrar det uttryckligen), gör det inte PostgreSQL. Således, om du verkligen bara har tid i kolumntid, så finns det inget sätt att du kan få samma ordning på rader som du har i din tabell, vilket leder till helt felaktiga resultat.
  4. Om du använder version 8.4 är din länk korrekt, men det skulle vara bättre om du använder nuvarande 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');

Fråga:

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

Förklaring:

  1. lag funktionen får värde i föregående rad för given partition. I vårt fall definieras partitionen av etikett.
  2. cast-operator :: kommer att ändra time skriv i interval , så att vi kan lägga till tid och få mer än 24 timmar.
  3. Vi jämför totalt med 24 timmars intervall och visar en snygg etikett yes eller no .

Uppdatering:

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. android JDBC mysql java-anslutningsapp:preDexDebug

  2. Hur hämtar jag föregående dag-poster från mysql-tabellen?

  3. TypeORM villkorlig nullbar?

  4. Hur man filtrerar rullgardinsvärden efter en annan rullgardinslista i ASP.NET, c#