PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL - Tetapkan nilai untuk setiap baris berdasarkan kriteria

Catatan:

  1. Jika rumus Anda benar-benar berfungsi di Excel, maka Anda telah menyimpan tanggal dalam sel, bukan waktu.
  2. Untuk D, E , saya tidak mengerti, bagaimana ini harus mengembalikan 'ya' ketika baris sebelumnya tidak memiliki label yang sama
  3. Anda harus menambahkan beberapa kolom dengan ID ke tabel Anda (!). Sementara Excel menyimpan urutan baris yang sama dalam lembar (kecuali Anda mengubahnya secara eksplisit), PostgreSQL tidak. Jadi, jika Anda benar-benar hanya memiliki waktu dalam waktu kolom, maka tidak mungkin Anda bisa mendapatkan urutan baris yang sama seperti yang Anda miliki di tabel Anda, sehingga menghasilkan hasil yang benar-benar salah.
  4. Jika Anda menggunakan versi 8.4 maka tautan Anda sudah benar, namun akan lebih baik jika Anda menggunakan dokumentasi

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

Pertanyaan:

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

Penjelasan:

  1. lag fungsi akan mendapatkan nilai di baris sebelumnya untuk partisi yang diberikan. Dalam kasus kami, partisi ditentukan oleh label.
  2. operator pemeran :: akan mengubah time ketik interval , sehingga kami dapat menambah waktu dan mendapatkan lebih dari 24 jam.
  3. Kami membandingkan total dengan interval 24 jam dan menampilkan label yang bagus yes atau no .

Pembaruan:

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. KESALAHAN:lebih dari satu baris yang dikembalikan oleh subquery yang digunakan sebagai ekspresi

  2. buat batasan unik per pengguna

  3. Bagaimana cara saya menulis kueri Django dengan subkueri sebagai bagian dari klausa WHERE?

  4. Iterasi melalui tabel, lakukan perhitungan pada setiap baris

  5. Batasan kunci asing dalam hubungan banyak-ke-banyak