PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL - Przypisz wartość do każdego wiersza na podstawie kryteriów

Uwagi:

  1. Jeśli Twoja formuła faktycznie działa w Excelu, to w komórkach zapisałeś daty, a nie czas.
  2. Dla D, E , nie rozumiem, jak to powinno zwrócić 'tak', gdy poprzedni wiersz nie ma tej samej etykiety
  3. Musisz dodać do swojej tabeli kolumnę z identyfikatorem (!). Podczas gdy Excel zachowuje tę samą kolejność wierszy w arkuszu (chyba że zmienisz to jawnie), PostgreSQL nie. Tak więc, jeśli naprawdę masz tylko czas w kolumnie, nie ma możliwości uzyskania takiej samej kolejności wierszy, jak w tabeli, co prowadzi do całkowicie błędnych wyników.
  4. Jeśli używasz wersji 8.4, Twój link jest poprawny, jednak byłoby lepiej, jeśli użyjesz aktualnego dokumentacja

Dane:

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

Zapytanie:

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

Wyjaśnienie:

  1. lag funkcja otrzyma wartość z poprzedniego wiersza dla danej przegrody. W naszym przypadku partycja jest zdefiniowana przez etykietę.
  2. operator rzutowania :: zmieni time wpisz w interval , dzięki czemu możemy dodać czas i uzyskać więcej niż 24 godziny.
  3. Porównujemy łączny interwał z 24 godzinami i wyświetlamy ładną etykietę yes lub no .

Aktualizacja:

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. optymalizacja wydajności offsetu/limitu

  2. Kolumna nie istnieje?

  3. Wykorzystanie szyfrowania do wzmocnienia bezpieczeństwa bazy danych PostgreSQL

  4. 3 sposoby na wyświetlenie listy wszystkich funkcji w PostgreSQL

  5. django postgresql walidacja schematu pola json