sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - Wijs waarde toe aan elke rij op basis van criteria

Opmerkingen:

  1. Als je formule echt werkt in Excel, dan heb je datums in cellen opgeslagen, geen tijd.
  2. Voor D, E , ik begrijp niet, hoe dit 'ja' moet retourneren als de vorige rij niet hetzelfde label heeft
  3. Je moet een kolom met ID aan je tabel toevoegen (!). Hoewel Excel dezelfde volgorde van rijen in het blad behoudt (tenzij u dit expliciet wijzigt), doet PostgreSQL dat niet. Dus als je echt alleen tijd hebt in kolomtijd, dan kun je op geen enkele manier dezelfde volgorde van rijen krijgen als in je tabel, wat leidt tot volledig onjuiste resultaten.
  4. Als je versie 8.4 gebruikt, dan is je link correct, maar het zou beter zijn als je de huidige documentatie

Gegevens:

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

Vraag:

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

Uitleg:

  1. lag functie krijgt waarde in de vorige rij voor de gegeven partitie. In ons geval wordt partitie gedefinieerd door label.
  2. cast-operator :: verandert time typ in interval , zodat we tijd kunnen toevoegen en meer dan 24 uur kunnen krijgen.
  3. We vergelijken het totaal met een interval van 24 uur en geven een mooi label weer yes of no .

Bijwerken:

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. Hoe de naam van het databaseschema te krijgen bij gebruik van de Oracle jdbc-verbinding?

  2. MySQL AS-sleutelwoord

  3. Door komma's gescheiden veld opvragen?

  4. Tabellen groeperen binnen een MySQL-database