PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL - Gán giá trị cho mỗi hàng dựa trên tiêu chí

Ghi chú:

  1. Nếu công thức của bạn thực sự hoạt động trong Excel, thì bạn đã lưu trữ ngày tháng trong ô chứ không phải thời gian.
  2. Đối với D, E , Tôi không hiểu, làm thế nào điều này sẽ trả về 'có' khi hàng trước đó không có cùng nhãn
  3. Bạn phải thêm một số cột có ID vào bảng của mình (!). Trong khi Excel giữ nguyên thứ tự các hàng trong trang tính (trừ khi bạn thay đổi nó một cách rõ ràng), PostgreSQL thì không. Vì vậy, nếu bạn thực sự chỉ có thời gian trong cột thời gian, thì không có cách nào bạn có thể có được thứ tự các hàng giống như bạn có trong bảng của mình, dẫn đến kết quả hoàn toàn không chính xác.
  4. Nếu bạn đang sử dụng phiên bản 8.4 thì liên kết của bạn là chính xác, tuy nhiên sẽ tốt hơn nếu bạn sử dụng hiện tại tài liệu

Dữ liệu:

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

Truy vấn:

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

Giải thích:

  1. lag hàm sẽ nhận giá trị ở hàng trước cho phân vùng đã cho. Trong trường hợp của chúng tôi, phân vùng được xác định theo nhãn.
  2. toán tử truyền :: sẽ thay đổi time gõ vào interval , vì vậy chúng tôi có thể thêm thời gian và có hơn 24 giờ.
  3. Chúng tôi so sánh tổng cộng với khoảng thời gian 24 giờ và hiển thị một nhãn đẹp yes hoặc no .

Cập nhật:

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. PostgreSQL:cách cập nhật các hàng trong CTE

  2. Làm cách nào để thay đổi quyền sở hữu tất cả các đối tượng trong một lược đồ cụ thể trong PostgreSQL?

  3. Có cách nào để tắt cập nhật / xóa nhưng vẫn cho phép trình kích hoạt thực hiện chúng không?

  4. Bảng điều khiển Rails - Tìm nơi được tạo vào =ngày nhất định

  5. Làm thế nào để truy cập thủ tục trả về con trỏ setof từ PostgreSQL trong Java?