首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL查询重构

PostgreSQL查询重构
EN

Database Administration用户
提问于 2016-10-21 13:27:41
回答 1查看 785关注 0票数 4

我有一个简单的表叫做events

它有日期、开始时间、结束时间和状态。

我有多个事件为同一日期,开始和结束。

要知道是否有人可以预约,我必须检查是否在那个日期和开始,结束我有一行的状态是假的(没有被占用)。

带有一些示例代码的表定义:

代码语言:javascript
复制
CREATE SEQUENCE events_id_seq;

CREATE TABLE events(
  id int4 NOT NULL DEFAULT nextval('events_id_seq'::regclass),
  event_date date NULL,
  status bool NULL DEFAULT false,
  event_start time NULL,
  event_end   time NULL
) ;

INSERT INTO events(event_date,status,event_start,event_end)
VALUES
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', FALSE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:00:00','08:30:00'),
('2016-10-10', TRUE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00'),
('2016-10-10', FALSE, '08:30:00','09:00:00');

select distinct event_date, event_start, event_end, (
    select count(*) from events e1
    where 
        e1.status = false and
        e1.event_date = e.event_date and
        e1.event_start = e.event_start and
        e1.event_end = e.event_end
) as free_slots from
events e
order by event_date, event_start;

http://sqlfiddle.com/#!15/698b7

这是可行的,但由于我不是SQL专家,我只是寻求其他形式的建议来解决这个问题,只是为了了解更多。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-10-24 14:05:07

如果您只想查看空闲插槽的数量,可以使用条件聚合简化查询:

代码语言:javascript
复制
select event_date, 
       event_start, 
       event_end,
       count(*) filter (where not status) as free_slots
from events e
group by event_date, event_start, event_end
order by event_date, event_start;

filter()条款是在Postgres 9.4中引入的。如果仍然使用旧版本,则可以使用CASE语句:

代码语言:javascript
复制
select event_date, 
       event_start, 
       event_end,
       count(case when not status then 1 end) as free_slots
from events e
group by event_date, event_start, event_end
order by event_date, event_start;

顺便说一句,status不是该列的一个很好的名称。像is_takenis_full这样的东西会更好,而且可能会引起更少的混乱。

票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/152994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档