代码之家  ›  专栏  ›  技术社区  ›  Soulzityr

查询是否仅获取在一个日期内具有多个会话的实体?

  •  1
  • Soulzityr  · 技术社区  · 6 年前

    例如,我传入这两个变量:startDate=1/14和endDate=1/20。

    如果员工Paul在1/18有两班,我想抓住他。如果特里在1/17有一个班次,不要抓住他。如果Paul在1/19也有两个班次,他应该出现在4行,每个班次一个。

    这是我到目前为止形成的查询的基础

    SELECT e.EmployeeID
       ,s.ShiftID
       ,s.ShiftDate
       ,s.ShiftType
    FROM Employee e
    JOIN Shift s ON s.EmployeeId = e.EmployeeId AND (s.Date >= @startDate AND s.Date <= @endDate)
    --This is the part I'm struggling with and is wrong somehow
    WHERE (
            SELECT COUNT(s2.ShiftId)
            FROM Shift s2
            WHERE s2.EmployeeId = e.EmployeeId AND s2.Date = s.Date AND s2.ShiftType IN ('TypeA', 'TypeB')
    ) > 1)
        AND s.ShiftType IN ('TypeA', 'TypeB')
    

    有人能帮我吗?我的WHERE过滤器有点错误,但它的基本原理是,我只尝试在两个日期参数内获取同一天内有多个班次的条目。我将如何表述这个查询?我是否在正确的轨道上?我希望这会起作用,但我在结果中看到一个条目,其中某人在1/14中只有一个条目,并且仍然出现在我的列表中。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Gordon Linoff    6 年前

    我不明白为什么需要任何聚合。您只需在同一天为同一员工寻找另一个班次:

    SELECT s.*
    FROM Shift s 
    WHERE s.Date >= @startDate AND
          s.Date <= @endDate AND
          s.ShiftType IN ('TypeA', 'TypeB') AND
          EXISTS (SELECT 1
                  FROM Shift s2
                  WHERE s2.EmployeeId = s.EmployeeId AND
                        s2.Date = s.Date AND
                        s2.ShiftType IN ('TypeA', 'TypeB') AND
                        s2.ShiftId <> s.ShiftId
                 );
    

    请注意,这不包括 employee

        2
  •  1
  •   Jim    6 年前

    您可以使用“WHERE EXISTS”进行如下查询:

    SELECT e.EmployeeID
       ,s.ShiftID
       ,s.ShiftDate
       ,s.ShiftType
    FROM Employee e
    JOIN Shift s ON s.EmployeeId = e.EmployeeId 
        AND (s.Date >= @startDate AND s.Date <= @endDate)
    WHERE EXISTS (
        SELECT 1
        FROM Shift s2
        WHERE s2.EmployeeId = s.EmployeeId 
            AND s2.Date = s.Date
        GROUP BY s2.EmployeeId, s2.Date
        HAVING COUNT(*) > 1
    )
    

    SELECT 
        s.EmployeeId, s.Date, COUNT(*)
    FROM Shift s
    GROUP BY s.EmployeeId, s.Date
    HAVING COUNT(*) > 1