sql - 如何在不使用变量的情况下选择在不同日期一列值相同的行?
问题描述
我以 DB Fiddle 为例:https ://www.db-fiddle.com/f/vX7yFVk8j6FPTSm2QVoPNE/2
我试图弄清楚如何查找在不同日期多次预订一个房间的客人的所有预订。我不能使用静态值/变量之类的bookings.check_in_date = '2018-03-05'
,也不能bookings.guest_id = 001
使用子查询。
我试过了:
SELECT bookings.guest_id, bookings.room_number, bookings.check_in_date, bookings.check_out_date
FROM bookings
GROUP BY bookings.guest_id, bookings.room_number, bookings.check_in_date, bookings.check_out_date
HAVING count(distinct bookings.check_in_date) >= 2;
但是,它并没有给我我正在寻找的结果,而是我正在寻找这个结果:
guest_id, room_number, check_in_date, check_out_date
1, 203, 2018-03-01T00:00:00.000Z, 2018-03-07T00:00:00.000Z
1, 203, 2018-03-14T00:00:00.000Z, 2018-03-21T00:00:00.000Z
架构 (PostgreSQL v10.0)
CREATE TABLE guests (
id integer,
name text,
address text,
city text,
state text,
postal_code integer,
phone_number numeric(10)
);
CREATE TABLE rooms (
room_number integer,
floor_number integer,
view boolean,
bed_type text
);
CREATE TABLE bookings (
id integer,
guest_id integer,
room_number integer,
order_date date,
check_in_date date,
check_out_date date
);
INSERT INTO guests (id, name, address, city, state, postal_code, phone_number)
VALUES
(1, 'John', '5 8th Avenue', 'New York', 'New York', 10001, 2021110190),
(2, 'Jane', '13 Wall St', 'New York', 'New York', 10001, 1112020190),
(3, 'Jim', '12 Water St', 'New York', 'New York', 10001, 3332224444),
(4, 'Fang', '12 Broadway', 'New York', 'New York', 10001, 1234567890),
(5, 'Bruce', '123 1st Ave', 'New York', 'New York', 10001, 9871112222);
INSERT INTO rooms (room_number, floor_number, view, bed_type)
VALUES
(101, 1, FALSE, 'King'),
(102, 1, FALSE, 'Queens'),
(203, 2, FALSE, 'Queens'),
(204, 2, TRUE, 'King'),
(409, 4, TRUE, 'King');
INSERT INTO bookings (id, guest_id, room_number, order_date, check_in_date, check_out_date)
VALUES
(18001, 001, 203, '2018-03-05', '2018-03-01', '2018-03-07'),
(18002, 001, 203, '2018-03-05', '2018-03-14', '2018-03-21'),
(18003, 001, 409, '2018-03-05', '2018-11-27', '2018-11-30'),
(18004, 001, 204, '2018-03-05', '2018-11-27', '2018-11-30'),
(18007, 002, 409, '2018-05-05', '2018-05-05', '2018-05-12'),
(18002, 002, 203, '2018-03-05', '2018-03-14', '2018-03-21'),
(18006, 002, 409, '2018-06-05', '2018-07-04', '2018-07-07'),
(18005, 003, 409, '2018-06-05', '2018-08-05', '2018-08-12'),
(18008, 004, 409, '2018-09-05', '2018-09-05', '2018-09-12');
解决方案
仅计算每个 guest_id 的预订数量应该可以让您的客人拥有多个预订
select a.*
from bookings a
join (
select guest_id,room_number,count(*)
from bookings
group by guest_id,room_number
having count(*)>1
)b
on a.guest_id=b.guest_id
And a.room_ number=b.room_number
推荐阅读
- c++ - 如何通过指针更改类成员值
- ruby - 尝试使用 Homebrew 安装 httpd 时权限被拒绝 @rb_system
- inversion-of-control - 温莎城堡类型化工厂的不同参数类型
- c# - azure app service与外部程序的通信解决方案
- powershell - 如何使用PowerShell删除Windows 10文件夹中多个文件名中的多个空格
- perl - perl 如何解决哈希中可能的哈希冲突?
- ios - 搜索控制器不显示搜索结果
- javascript - 如何从本地文件中读取 Json
- c# - 正确捕获 OnCollectionChanged 和 OnPropertyChanged 事件
- javascript - 订阅了 Knockout ObservableArray 但显示空数组的数据