You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server技术问题:查找存在于所有时段/序列的room_ID

查找存在于所有序列(时段)的room_ID

我有一张表Y,已插入room_ID、时段字段(date_from、date_to)和序列字段seq。需要找出存在于**所有不同序列(时段)**的room_ID,比如示例中的room_ID 2就符合要求——它在seq为1、2、3的所有时段里都有记录。

示例数据的SQL代码如下:

DECLARE @y TABLE
(room_id    numeric(10,0)   null,
 date_from  datetime        null,
 date_to    datetime        null,
 seq        int             null)

INSERT @y
SELECT 2, '2023-05-01','2023-05-02',1

INSERT @y
SELECT 5, '2023-05-01','2023-05-02',1

INSERT @y
SELECT 8, '2023-05-01','2023-05-02',1

INSERT @y
SELECT 2, '2023-05-02','2023-05-03',2

INSERT @y
SELECT 8, '2023-05-02','2023-05-03',2

INSERT @y
SELECT 2, '2023-05-07','2023-05-09',3

解决方案

方法1:分组统计匹配序列数

先统计总共有多少个不同的seq,再分组统计每个room_id对应的distinct seq数量,两者相等的就是符合要求的room_id:

-- 先获取总序列数
DECLARE @total_seq INT = (SELECT COUNT(DISTINCT seq) FROM @y);

-- 筛选出覆盖所有序列的room_id
SELECT room_id
FROM @y
GROUP BY room_id
HAVING COUNT(DISTINCT seq) = @total_seq;

方法2:用EXCEPT排除缺失序列的room_id

先生成所有room_id和所有seq的笛卡尔积,再减去表中已有的room_id+seq组合,剩下的就是存在缺失序列的room_id,最后取补集:

SELECT DISTINCT room_id
FROM @y
WHERE room_id NOT IN (
    SELECT r.room_id
    FROM (SELECT DISTINCT room_id FROM @y) r
    CROSS JOIN (SELECT DISTINCT seq FROM @y) s
    EXCEPT
    SELECT room_id, seq FROM @y
);

两种方法都能得到目标结果:room_id = 2。

内容的提问来源于stack exchange,提问作者PanosPlat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:53:15