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



>问题:

我需要进行一个 SELECT 查询,该查询返回shift_idday_of_weekIN (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

最新更新