PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL - Присвояване на стойност на всеки ред въз основа на критерии

Бележки:

  1. Ако вашата формула действително работи в Excel, тогава сте съхранили дати в клетки, а не време.
  2. За D, E , не разбирам как това трябва да върне „да“, когато предишният ред няма същия етикет
  3. Трябва да добавите колона с ID към вашата таблица (!). Докато Excel запазва същия ред на редовете в листа (освен ако не го промените изрично), PostgreSQL не го прави. По този начин, ако наистина имате само време във времето на колона, тогава няма начин да получите същия ред на редовете, както имате във вашата таблица, което води до напълно неправилни резултати.
  4. Ако използвате версия 8.4, връзката ви е правилна, но би било по-добре да използвате текущия документация

Данни:

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

Заявка:

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

Обяснение:

  1. lag функцията ще получи стойност в предишния ред за даден дял. В нашия случай дялът се определя от етикет.
  2. каст оператор :: ще промени time въведете interval , така че можем да добавим време и да получим повече от 24 часа.
  3. Сравняваме общата сума с интервал от 24 часа и показваме хубав етикет yes или no .

Актуализация:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как работи функцията to_number() в PostgreSQL

  2. Postgresql заявка между периоди от време

  3. Изключване на съответстващите елементи на масива

  4. Създаване на бази данни в SQLAlchemy тестове с PostgreSQL

  5. JPA и JSON операторска собствена заявка