sql—如何获取组的结果,其中记录应同时存在于一个匹配项中,而不存在于另一个匹配项中

iyzzxitl  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(388)

问题:
我需要做一个返回 shift_id 哪里 day_of_weekIN (0,1,2,3,4) 以及 NOT IN (5,6) ,例如:
“查找轮班日为星期天到星期四(星期五到星期六不存在记录)的轮班”
数据库结构:
shifts :

shift_id - int, primary key
...      - other columns

shift_days :

shift_day_id - int, primary key
shift_id     - int, foreign key to shifts table
day_of_week  - int, where 0 = Sunday, 1 = Monday,..., 6 - Saturday
...          - more columns

前任。
如果班次是星期一到星期五,那么 shift_days 只有5张记录 day_of_week 从1到5
如果轮班时间是星期天到星期四,那么 shift_days 只有5张记录 day_of_week 从0到4
db小提琴:
db小提琴(原件)
db fiddle(实时更新答案)
p、 我提出了这个问题:

SELECT shift_id
FROM (
    SELECT shift_id, STRING_AGG(day_of_week, ',') AS 'days_of_week'
    FROM shift_days
    GROUP BY shift_id
) AS sdw
WHERE sdw.days_of_week = '0,1,2,3,4'

但我不知道如何保证顺序升序为'0,1,2,3,4',我想看看是否有一个替代使用字符串\u agg的情况下,我想使用不同的sql方言。
p、 附言。
再次强调的是,任何与周(5,6)的第天匹配的班次都是错误的匹配,因为我想排除这些记录。我想包括(0,1,2,3,4)条记录,必须包含所有0-4条记录。

uxh89sit

uxh89sit1#

可以尝试以下查询:

如果你想让所有的班次 day_of_week 5,6 ```
SELECT DISTINCT shift_id
FROM shift_days S
WHERE NOT EXISTS (SELECT 1 FROM shift_days T WHERE T.shift_id=S.shift_id AND
T.day_of_week in (5, 6))

如果你想让所有的班次 `day_of_week 0,1,2,3,4` ```
SELECT  shift_id FROM shift_days S
WHERE NOT EXISTS (SELECT 1 FROM shift_days T WHERE T.shift_id=S.shift_id AND 
T.day_of_week in (5, 6))
and day_of_week in (0,1,2,3,4)
group by shift_id having count(1)=5

如需参考,请单击此处进行演示

zvms9eto

zvms9eto2#

group by shift_id
having
    count(case when day_of_week in (5, 6) then 1 end) = 0
    and count(distinct day_of_week) = 5

相关问题