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

Nhận tổng khoảng thời gian từ nhiều hàng nếu chuỗi không bị hỏng

Có thể có một cách để thực hiện việc này trong một SQL select, nhưng tôi không hiểu. Mặc dù vậy, tôi đã quản lý để làm điều đó với một chức năng được lưu trữ. Đây là những gì tôi đã làm cho thử nghiệm của mình:

create table work
(id integer, start_date date, end_date date);

insert into work values (1, '2011-01-01','2011-02-02');
insert into work values (1, '2011-02-02','2011-04-04');
insert into work values (1, '2011-06-06','2011-09-09');
insert into work values (2, '2011-01-01','2011-02-02');
insert into work values (2, '2011-02-02','2011-03-03');

create or replace function get_data() returns setof work as
$body$
declare
    res work%rowtype;
    sd  date := null;
begin
    for res in
        select
            w1.id,
            case when exists (select 1 from work w2 where w1.id=w2.id and w2.end_date=w1.start_date) then null else w1.start_date end,
            case when exists (select 1 from work w2 where w1.id=w2.id and w2.start_date=w1.end_date) then null else w1.end_date end
        from
            work w1
        order by
            id, start_date, end_date
    loop
        if res.start_date is not null and res.end_date is not null then
            return next res;
        elsif res.start_date is not null then
            sd := res.start_date;
        elsif res.end_date is not null then
            res.start_date := sd;
            return next res;
        end if;
    end loop;

    return;
end;$body$
  language 'plpgsql';

Sau đó

select * from get_data() order by id, start_date;

trả về kết quả này:

 id | start_date |  end_date
----+------------+------------
  1 | 2011-01-01 | 2011-04-04
  1 | 2011-06-06 | 2011-09-09
  2 | 2011-01-01 | 2011-03-03
(3 rows)

đó là, tôi nghĩ, những gì bạn đang theo đuổi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng psql's \ copy cho truy vấn nhiều dòng

  2. Làm cách nào để lấy tên cột danh sách và kiểu dữ liệu của bảng trong PostgreSQL?

  3. chown:/var/lib/postgresql/data/postgresql.conf:Hệ thống tệp chỉ đọc

  4. PostgreSQL:giữa với datetime

  5. Bản ghi điểm kiểm tra chính không hợp lệ của Docker postgres