>问题:
我需要进行一个 SELECT 查询,该查询返回shift_id
day_of_week
是IN (0,1,2,3,4)
和NOT IN (5,6)
, 如:
"查找轮班日为周日至周四的班次(周五至周六没有记录(">
数据库结构:
表shifts
:
shift_id - 整数,主键 ... - 其他列
表shift_days
:
shift_day_id - 整数,主键 shift_id - int,移位表的外键 day_of_week - int,其中 0 = 星期日,1 = 星期一,..., 6 - 星期六 ... - 更多列
例如。
- 如果班次是星期一 - 星期五,则
shift_days
只有 5 条记录,day_of_week
从 1 到 5 - 如果班次是星期日 - 星期四,则
shift_days
只有 5 条记录,day_of_week
从 0 到 4
DB小提琴:
- DB 小提琴(原始发布(
- DB 小提琴(实时更新答案(
附言我能够提出这个查询:
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",我想看看是否有使用 STRING_AGG 的替代方案,以防我想用于不同的 SQL 方言。
附言
再次强调的是,任何与 (5,6( 匹配day_of_week的偏移都是错误的匹配,因为我想排除这些记录。 并且我想包括 (0,1,2,3,4( 记录,这些记录必须包含所有 0-4。
可以尝试以下查询:
如果您希望所有班次都没有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
有关参考,请单击此处进行演示
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