sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL - Přiřaďte hodnotu každému řádku na základě kritérií

Poznámky:

  1. Pokud váš vzorec skutečně funguje v Excelu, máte v buňkách uložena data, nikoli čas.
  2. Pro D, E , nechápu, jak by to mělo vrátit 'ano', když předchozí řádek nemá stejný štítek
  3. Do tabulky musíte přidat sloupec s ID (!). Zatímco Excel zachovává stejné pořadí řádků v listu (pokud to výslovně nezměníte), PostgreSQL ne. Pokud tedy máte opravdu jen čas v čase sloupců, neexistuje způsob, jak získat stejné pořadí řádků, jaké máte ve své tabulce, což vede ke zcela nesprávným výsledkům.
  4. Pokud používáte verzi 8.4, pak je váš odkaz správný, ale bylo by lepší, kdybyste použili aktuální dokumentace

Údaje:

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

Dotaz:

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

Vysvětlení:

  1. lag funkce získá hodnotu v předchozím řádku pro daný oddíl. V našem případě je oddíl definován štítkem.
  2. operátor castingu :: změní time zadejte do interval , takže můžeme přidat čas a získat více než 24 hodin.
  3. Porovnáváme celkový počet s 24hodinovým intervalem a zobrazujeme pěkný štítek yes nebo no .

Aktualizace:

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. sql dotaz, který vrátí rozdíly mezi dvěma tabulkami

  2. JDBC ResultSet:Potřebuji getDateTime, ale existuje pouze getDate a getTimeStamp

  3. JDBC - Statement, PreparedStatement, CallableStatement a ukládání do mezipaměti

  4. Jak vygenerovat DDL pro všechny tabulky v databázi v MySQL