【问题标题】:How to get result of a group by where records should both exist in a match and not exists in another match如何通过记录应该存在于匹配中而不存在于另一个匹配中来获取组的结果
【发布时间】:2020-05-18 20:32:00
【问题描述】:

问题:

我需要进行一个返回 shift_id 的 SELECT 查询,其中 day_of_weekIN (0,1,2,3,4)NOT IN (5,6), 如:

“查找轮班日为周日至周四的班次(周五至周六没有记录)”

数据库结构:

shifts:

shift_id - int,主键 ... - 其他列

shift_days:

shift_day_id - int,主键 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 小提琴:

附言 我能够想出这个查询:

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 方言。

附言

再次强调,匹配 day_of_week (5,6) 的任何班次都是错误匹配,因为我想排除这些记录。 并且我想包含 (0,1,2,3,4) 记录,这些记录必须全部为 0-4。

【问题讨论】:

    标签: sql sql-server grouping sql-server-2017


    【解决方案1】:

    可以尝试以下查询:

    如果您希望所有班次都没有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
    

    供参考click here for demo

    【讨论】:

    • 这是一个好的开始,但是如何将它与“必须在 (0,1,2,3,4) 中”结合起来
    • 我认为修改后的答案正是我所需要的,谢谢!据我了解,我可以用 COUNT(shift_id) 替换 COUNT(1)?因此,首先不匹配 (5,6),group by 将返回匹配“day_of_week in”的那些,并且 HAVING COUNT 匹配该组“day_of_week in”中的记录数。另外,我可以松散地匹配 IN (0,1,2,3,4) .... HAVING COUNT (shift_id) > 0 之类的东西?
    【解决方案2】:
    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
    

    【讨论】:

    • 非常感谢!这与 Somendra Kanaujia 的回答非常相似,它让我对如何使用 group by ... 拥有和操纵 group 结果有了更多的见解。向你致敬!
    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多